提问人:Seyma Kalay 提问时间:5/6/2023 最后编辑:user438383Seyma Kalay 更新时间:5/6/2023 访问量:105
如果不满足条件,则从列表中删除数据框
Remove data frame from list if doesn’t satisfy a condition
问:
我在下面有一个列表对象。我想从列表中删除 和,因为它们没有“ID”列。如何解决这个问题?提前非常感谢。df2
df3
my_list <- list(df1 = data.frame(ID = 1:5, Name = letters[1:5]),
df2 = matrix(c(1, 2, 3, 4), ncol = 2),
df3 = data.frame(Name = letters[6:10], Age = c(20, 25, 30, 35, 40)))
sapply(my_list, function(x) "ID" %in% colnames(x))
for (i in sequence(my_list)) {
if (sapply(my_list, function(x) "ID" %in% colnames(x)) == FALSE) {
DROP THE df2 and df3
}
}
答:
3赞
Darren Tsai
5/6/2023
#1
Filter()
from 提取逻辑函数为其提供 true 的列表元素。base
Filter(\(df) "ID" %in% colnames(df), my_list)
等效的选项是:purrr
keep/discard
purrr::keep(my_list, ~ "ID" %in% colnames(.x))
purrr::discard(my_list, ~ !"ID" %in% colnames(.x))
输出
$df1
ID Name
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
2赞
user438383
5/6/2023
#2
您可以使用普通逻辑子集:
my_list[sapply(my_list, function(x) "ID" %in% colnames(x))]
2赞
akrun
5/6/2023
#3
使用循环for
for(nm in names(my_list)) if(!"ID" %in% names(my_list[[nm]])) my_list[[nm]] <- NULL
1赞
TarJae
5/6/2023
#4
另一种选择是使用布尔向量来子集列表。这里我们使用:map_lgl
library(purrr)
my_list[map_lgl(my_list, ~ "ID" %in% colnames(.))]
$df1
ID Name
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
评论