在数据框中快速选择包含列表中匹配项的行的方法

3
我有一个数据框,其中包含存储ID的列表的列表:
a <- list(as.character(c(1, 2, 3)))
b <- list(as.character(c(2, 3, 5)))
c <- list(as.character(c(4, 6, 8)))
df <- data.frame(NAME = c("A1", "A2", "A3"), stat = c(14, 15, 16)) 
df$IDs[1] <- a      
df$IDs[2] <- b   
df$IDs[3] <- c

此外,我有一个字符列表,是我想要追踪的感兴趣ID的参考资料。
x <- list(as.character(c(2, 3)))

我想过滤初始数据框,使其仅包含数据框ID列中为2和/或3的行(即x匹配到df $ ID; 因此在这种情况下仅包含名为A1A2的行)。

实际数据框有数百行,因此如果可能的话,我希望有一条比循环更短的路线。
如果您有不同的方法(例如对初始df进行更多操作),我也很乐意听到。

提前致谢。


嗨!谢谢你昨天的提示和回答 :) 我想看看有什么样的方法,但我认为这个帖子中的解决方案对我有效。祝你今天愉快! - M. L
2个回答

3
您可以使用 sapplymapply
df[sapply(df$IDs, \(id) any(x[[1]] %in% id)), ]

df[mapply(\(a, b) any(a %in% b), x, df$IDs), ]
输出
#   NAME stat     IDs
# 1   A1   14 1, 2, 3
# 2   A2   15 2, 3, 5

2
使用 tidyverse
library(dplyr)
library(purrr)
df %>%
    filter(map_lgl(IDs, ~ any(unlist(x) %in% .x)))
  NAME stat     IDs
1   A1   14 1, 2, 3
2   A2   15 2, 3, 5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接