按条件从列表中删除元素
Remove elements from a list by condition
我有一个包含 108 个数据帧的列表,假设它称为“LDF”,在此列表中,所有对象都具有相同的列“VALUE”等。我需要做的是对 R:
说
如果列表的每个 DF 的 SUM(VALUE) 大于 0,则将此元素保留在列表中,否则,将其删除。
基本上我应该在过程结束时有 104 个数据帧
我正在避免使用 for 循环。有人能想到使用 APPLY 的解决方案吗?
正在尝试:
LDF <- LDF[sapply(LDF$Value, sum) > 0]
但结果是 'List of 0'
采样 df:
LDF <- list(structure(list(Date = structure(c(18765, 18767, 18778, 18778,
18779, 18787, 18795, 18809, 18809, 18809, 18820, 18821, 18848,
18864, 18871, 18880, 18885, 18886), class = "Date"), Value = c(120000,
40000, 55000, -11.38, -115091.86, 30000, 98400, 1720, 50000,
-50062.58, -2502.82, -20021.71, 28619.27, 45781.12, 14953.83,
-6017.31, -3310.73, -140372.91)), row.names = c(NA, -18L), class = c("tbl_df",
"tbl", "data.frame")), structure(list(Date = structure(c(18820,
18820, 18820, 18820, 18820, 18821, 18857, 18857, 18857, 18857,
18857, 18857, 18858, 18871, 18871, 18887, 18887, 18890, 18890
), class = "Date"), Value = c(41000, 41000, 122754.88, 41000,
41000, 82000, -41080.42, -41432.51, -160308.38, -120504.54, -37214.87,
-76707.98, -42592.41, -41248.63, -41824.33, -120572.42, -37472.61,
-79312, -34830.47)), row.names = c(NA, -19L), class = c("tbl_df",
"tbl", "data.frame")))
我们需要提取循环内的列。 LDF
是一个 list
的数据。frame/tibble,因此 LDF$Value
不存在
i1 <- sapply(LDF, function(x) sum(x$Value)) > 0
LDF[i1]
-输出
[[1]]
# A tibble: 18 x 2
Date Value
<date> <dbl>
1 2021-05-18 120000
2 2021-05-20 40000
3 2021-05-31 55000
4 2021-05-31 -11.4
5 2021-06-01 -115092.
6 2021-06-09 30000
7 2021-06-17 98400
8 2021-07-01 1720
9 2021-07-01 50000
10 2021-07-01 -50063.
11 2021-07-12 -2503.
12 2021-07-13 -20022.
13 2021-08-09 28619.
14 2021-08-25 45781.
15 2021-09-01 14954.
16 2021-09-10 -6017.
17 2021-09-15 -3311.
18 2021-09-16 -140373.
要检查被删除的元素,否定(!
)逻辑向量并检查
which(!i1)
给出位置
LDF[!i1]
或者也可以使用 Filter
Filter(\(x) sum(x$Value) >0, LDF)
或 keep
来自 purrr
library(purrr)
keep(LDF, ~ sum(.x$Value) > 0)
或者相反的是discard
discard(LDF, ~ sum(.x$Value) > 0)
我有一个包含 108 个数据帧的列表,假设它称为“LDF”,在此列表中,所有对象都具有相同的列“VALUE”等。我需要做的是对 R:
说如果列表的每个 DF 的 SUM(VALUE) 大于 0,则将此元素保留在列表中,否则,将其删除。
基本上我应该在过程结束时有 104 个数据帧
我正在避免使用 for 循环。有人能想到使用 APPLY 的解决方案吗?
正在尝试:
LDF <- LDF[sapply(LDF$Value, sum) > 0]
但结果是 'List of 0'
采样 df:
LDF <- list(structure(list(Date = structure(c(18765, 18767, 18778, 18778,
18779, 18787, 18795, 18809, 18809, 18809, 18820, 18821, 18848,
18864, 18871, 18880, 18885, 18886), class = "Date"), Value = c(120000,
40000, 55000, -11.38, -115091.86, 30000, 98400, 1720, 50000,
-50062.58, -2502.82, -20021.71, 28619.27, 45781.12, 14953.83,
-6017.31, -3310.73, -140372.91)), row.names = c(NA, -18L), class = c("tbl_df",
"tbl", "data.frame")), structure(list(Date = structure(c(18820,
18820, 18820, 18820, 18820, 18821, 18857, 18857, 18857, 18857,
18857, 18857, 18858, 18871, 18871, 18887, 18887, 18890, 18890
), class = "Date"), Value = c(41000, 41000, 122754.88, 41000,
41000, 82000, -41080.42, -41432.51, -160308.38, -120504.54, -37214.87,
-76707.98, -42592.41, -41248.63, -41824.33, -120572.42, -37472.61,
-79312, -34830.47)), row.names = c(NA, -19L), class = c("tbl_df",
"tbl", "data.frame")))
我们需要提取循环内的列。 LDF
是一个 list
的数据。frame/tibble,因此 LDF$Value
不存在
i1 <- sapply(LDF, function(x) sum(x$Value)) > 0
LDF[i1]
-输出
[[1]]
# A tibble: 18 x 2
Date Value
<date> <dbl>
1 2021-05-18 120000
2 2021-05-20 40000
3 2021-05-31 55000
4 2021-05-31 -11.4
5 2021-06-01 -115092.
6 2021-06-09 30000
7 2021-06-17 98400
8 2021-07-01 1720
9 2021-07-01 50000
10 2021-07-01 -50063.
11 2021-07-12 -2503.
12 2021-07-13 -20022.
13 2021-08-09 28619.
14 2021-08-25 45781.
15 2021-09-01 14954.
16 2021-09-10 -6017.
17 2021-09-15 -3311.
18 2021-09-16 -140373.
要检查被删除的元素,否定(!
)逻辑向量并检查
which(!i1)
给出位置
LDF[!i1]
或者也可以使用 Filter
Filter(\(x) sum(x$Value) >0, LDF)
或 keep
来自 purrr
library(purrr)
keep(LDF, ~ sum(.x$Value) > 0)
或者相反的是discard
discard(LDF, ~ sum(.x$Value) > 0)