我在下面有一个列表对象。我想从列表中删除
df2
和df3
,因为它们没有“ID”列。如何解决这个问题?非常感谢。
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
}
}
Filter()
从 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
您可以使用正常的逻辑子集:
my_list[sapply(my_list, function(x) "ID" %in% colnames(x))]
使用
for
循环
for(nm in names(my_list)) if(!"ID" %in% names(my_list[[nm]])) my_list[[nm]] <- NULL
另一个选项是使用布尔向量对列表进行子集化。这里我们使用
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