通过阈值过滤列表的多个数据帧

问题描述 投票:0回答:3

我有这个清单:

df.list <- list(`2023-02-15_10-30-49` = list(V4 = c(5019.00214, 5019.00215, 
5019.00216, 5019.00217, 5019.00218, 5019.00214, 5019.00215, 5019.00215, 
5019.00215, 5019.00215, 5019.00215, 5019.00215, 5019.00214, 5019.00214
), V6 = c(500.86491, 500.86495, 500.86497, 500.86498, 500.86499, 
500.86375, 500.86374, 500.86372, 500.86372, 500.86372, 500.86373, 
500.86372, 500.86373, 500.86372), V8 = c(235.314, 235.423, 235.502, 
235.556, 235.606, 230.496, 230.502, 230.561, 230.556, 230.553, 
230.564, 230.555, 230.59, 230.598), V10 = c(0.38, 0.37, 0.37, 
0.37, 0.36, 0.037, 0.025, 0.014, 0.014, 0.014, 0.014, 0.014, 
0.014, 0.014), V11 = c(0.75, 0.73, 0.71, 0.7, 0.69, 0.056, 0.04, 
0.017, 0.015, 0.015, 0.015, 0.015, 0.014, 0.015)), `2023-02-15_10-33-16` = list(
    V4 = c(5019.00198, 5019.00194, 5019.00193, 5019.00193, 5019.00216, 
    5019.00194, 5019.00194, 5019.00194, 5019.00194, 5019.00194, 
    5019.00194, 5019.00194, 5019.00194, 5019.00194, 5019.00194, 
    5019.00195, 5019.00195, 5019.00195), V6 = c(500.86428, 500.86419, 
    500.86421, 500.86423, 500.86392, 500.86343, 500.86341, 500.86341, 
    500.86342, 500.86342, 500.86342, 500.86342, 500.86342, 500.86342, 
    500.86342, 500.86344, 500.86343, 500.86343), V8 = c(233.154, 
    233.162, 233.155, 233.142, 230.303, 230.491, 230.464, 230.457, 
    230.466, 230.474, 230.472, 230.482, 230.479, 230.476, 230.488, 
    230.496, 230.497, 230.499), V10 = c(0.37, 0.37, 0.37, 0.37, 
    1.2, 0.014, 0.014, 0.014, 0.014, 0.014, 0.014, 0.014, 0.015, 
    0.015, 0.014, 0.014, 0.014, 0.014), V11 = c(0.6, 0.6, 0.6, 
    0.6, 0.82, 0.017, 0.017, 0.019, 0.021, 0.021, 0.022, 0.022, 
    0.024, 0.023, 0.021, 0.019, 0.018, 0.019)), `2023-02-15_10-33-46` = list(
    V4 = c(5019.00175, 5019.00175, 5019.00175, 5019.00175, 5019.00175, 
    5019.00174, 5019.00175, 5019.00175, 5019.00175, 5019.00174, 
    5019.00173, 5019.00173), V6 = c(500.86318, 500.86319, 500.86318, 
    500.86318, 500.86318, 500.86318, 500.86315, 500.86315, 500.86315, 
    500.86315, 500.86313, 500.86312), V8 = c(230.518, 230.525, 
    230.514, 230.515, 230.531, 230.539, 230.507, 230.506, 230.509, 
    230.513, 230.502, 230.486), V10 = c(0.016, 0.018, 0.018, 
    0.019, 0.021, 0.098, 0.015, 0.014, 0.014, 0.014, 0.014, 0.014
    ), V11 = c(0.023, 0.026, 0.028, 0.029, 0.035, 0.15, 0.024, 
    0.022, 0.021, 0.019, 0.02, 0.022)))

我想用阈值过滤列表的数据帧。为此,我使用了以下代码:

df.list <- lapply(df.list, function(i) filter(i, V10 <= 0.025))

不幸的是,当我应用此代码时,出现此错误消息:

Error in UseMethod("filter") : 
no applicable method for 'filter' applied to an object of class "list"
r dataframe list subset lapply
3个回答
2
投票

您有一个列表列表,需要将其转换为数据框列表。使用

purrr
dplyr
我们可以执行以下操作:

library(purrr)
library(dplyr)

map(df.list, ~bind_cols(.x) %>% filter(V10 <= 0.025))
#> $`2023-02-15_10-30-49`
#> # A tibble: 8 × 5
#>      V4    V6    V8   V10   V11
#>   <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 5019.  501.  231. 0.025 0.04 
#> 2 5019.  501.  231. 0.014 0.017
#> 3 5019.  501.  231. 0.014 0.015
#> 4 5019.  501.  231. 0.014 0.015
#> 5 5019.  501.  231. 0.014 0.015
#> 6 5019.  501.  231. 0.014 0.015
#> 7 5019.  501.  231. 0.014 0.014
#> 8 5019.  501.  231. 0.014 0.015
#> 
#> $`2023-02-15_10-33-16`
#> # A tibble: 13 × 5
#>       V4    V6    V8   V10   V11
#>    <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1 5019.  501.  230. 0.014 0.017
#>  2 5019.  501.  230. 0.014 0.017
#>  3 5019.  501.  230. 0.014 0.019
#>  4 5019.  501.  230. 0.014 0.021
#>  5 5019.  501.  230. 0.014 0.021
#>  6 5019.  501.  230. 0.014 0.022
#>  7 5019.  501.  230. 0.014 0.022
#>  8 5019.  501.  230. 0.015 0.024
#>  9 5019.  501.  230. 0.015 0.023
#> 10 5019.  501.  230. 0.014 0.021
#> 11 5019.  501.  230. 0.014 0.019
#> 12 5019.  501.  230. 0.014 0.018
#> 13 5019.  501.  230. 0.014 0.019
#> 
#> $`2023-02-15_10-33-46`
#> # A tibble: 11 × 5
#>       V4    V6    V8   V10   V11
#>    <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1 5019.  501.  231. 0.016 0.023
#>  2 5019.  501.  231. 0.018 0.026
#>  3 5019.  501.  231. 0.018 0.028
#>  4 5019.  501.  231. 0.019 0.029
#>  5 5019.  501.  231. 0.021 0.035
#>  6 5019.  501.  231. 0.015 0.024
#>  7 5019.  501.  231. 0.014 0.022
#>  8 5019.  501.  231. 0.014 0.021
#>  9 5019.  501.  231. 0.014 0.019
#> 10 5019.  501.  231. 0.014 0.02 
#> 11 5019.  501.  230. 0.014 0.022

1
投票

试试

lapply(df.list, \(x) subset(as.data.frame(x), V10 <= 0.025))

0
投票

也许我们可以尝试嵌套

lapply

lapply(
    df.list,
    \(x) lapply(
        x,
        `[`,
        x$V10<=0.025
    )
)

这给

$`2023-02-15_10-30-49`
$`2023-02-15_10-30-49`$V4
[1] 5019.002 5019.002 5019.002 5019.002 5019.002 5019.002 5019.002 5019.002

$`2023-02-15_10-30-49`$V6
[1] 500.8637 500.8637 500.8637 500.8637 500.8637 500.8637 500.8637 500.8637

$`2023-02-15_10-30-49`$V8
[1] 230.502 230.561 230.556 230.553 230.564 230.555 230.590 230.598

$`2023-02-15_10-30-49`$V10
[1] 0.025 0.014 0.014 0.014 0.014 0.014 0.014 0.014

$`2023-02-15_10-30-49`$V11
[1] 0.040 0.017 0.015 0.015 0.015 0.015 0.014 0.015


$`2023-02-15_10-33-16`
$`2023-02-15_10-33-16`$V4
 [1] 5019.002 5019.002 5019.002 5019.002 5019.002 5019.002 5019.002 5019.002
 [9] 5019.002 5019.002 5019.002 5019.002 5019.002

$`2023-02-15_10-33-16`$V6
 [1] 500.8634 500.8634 500.8634 500.8634 500.8634 500.8634 500.8634 500.8634
 [9] 500.8634 500.8634 500.8634 500.8634 500.8634

$`2023-02-15_10-33-16`$V8
 [1] 230.491 230.464 230.457 230.466 230.474 230.472 230.482 230.479 230.476
[10] 230.488 230.496 230.497 230.499

$`2023-02-15_10-33-16`$V10
 [1] 0.014 0.014 0.014 0.014 0.014 0.014 0.014 0.015 0.015 0.014 0.014 0.014
[13] 0.014

$`2023-02-15_10-33-16`$V11
 [1] 0.017 0.017 0.019 0.021 0.021 0.022 0.022 0.024 0.023 0.021 0.019 0.018
[13] 0.019


$`2023-02-15_10-33-46`
$`2023-02-15_10-33-46`$V4
 [1] 5019.002 5019.002 5019.002 5019.002 5019.002 5019.002 5019.002 5019.002
 [9] 5019.002 5019.002 5019.002

$`2023-02-15_10-33-46`$V6
 [1] 500.8632 500.8632 500.8632 500.8632 500.8632 500.8632 500.8632 500.8632
 [9] 500.8632 500.8631 500.8631

$`2023-02-15_10-33-46`$V8
 [1] 230.518 230.525 230.514 230.515 230.531 230.507 230.506 230.509 230.513
[10] 230.502 230.486

$`2023-02-15_10-33-46`$V10
 [1] 0.016 0.018 0.018 0.019 0.021 0.015 0.014 0.014 0.014 0.014 0.014

$`2023-02-15_10-33-46`$V11
 [1] 0.023 0.026 0.028 0.029 0.035 0.024 0.022 0.021 0.019 0.020 0.022
© www.soinside.com 2019 - 2024. All rights reserved.