如果不满足条件,则从列表中删除数据框

Remove data frame from list if doesn’t satisfy a condition

提问人:Seyma Kalay 提问时间:5/6/2023 最后编辑:user438383Seyma Kalay 更新时间:5/6/2023 访问量:105

问:

我在下面有一个列表对象。我想从列表中删除 和,因为它们没有“ID”列。如何解决这个问题?提前非常感谢。df2df3

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
  }
} 
r dplyr tidyr 数据操作 整洁

评论


答:

3赞 Darren Tsai 5/6/2023 #1

Filter()from 提取逻辑函数为其提供 true 的列表元素。base

Filter(\(df) "ID" %in% colnames(df), my_list)

等效的选项是:purrrkeep/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