如果向量的任何值在列表中,则返回 true



假设我有一个数据帧,其中包含一个名为member_id的列。有时member_id是一个单一的数值,有时它将是给定用户拥有的所有member_id的逗号分隔列表。

我想过滤掉数据帧中member_id不在某个列表中的所有行,我们称该列表为:finalized_list. 我无法弄清楚如何隐式迭代包含逗号分隔列表的单元格,如果其中任何一个在finalized_list中,则返回 TRUE。

对于可重现的示例,我似乎无法弄清楚如何将向量放入数据帧中的特定单元格中,但想象一下如下所示:

例如

data <- data.frame(member_id = c('100', '200',  list(c('300','400')), '400', '500'))
finalized_list <- c('100', '200', '300') 

我尝试做这样的事情:

complete_df <- data[data$member_id %in% finalized_list, ] 

但这不会正确处理像 C(300, 400( 这样的列表。 我认为any可能会解决问题:

complete_df <- data[any(data$member_id %in% finalized_list), ] 

但这也没有用。

思潮?

data <- data.frame(member_id = c('100', '200',  paste0(c('300','400'), collapse = ','), '400', '500'))
finalized_list <- c('100', '200', '300') 
data
member_id
1       100
2       200
3   300,400
4       400
5       500

在与%in%进行比较之前,您需要拆分逗号分隔值。我会使用apply函数来遍历变量、拆分(如有必要(并与finalized_list进行比较:

sapply(data$member_id, function(x) {
any(strsplit(as.character(x), split = ',')[[1]] %in% finalized_list)
})
[1]  TRUE  TRUE  TRUE FALSE FALSE

首先,让我们创建一个 data.frame,其中一列包含多个元素的列表

data <- data.frame(a=c('100', '200'), b='400', c='500')
data$d <- list(list('300','400'), '600')
#     a   b   c        d
# 1 100 400 500 300, 400
# 2 200 400 500      600

现在我们可以按以下方式过滤这些

data[apply(data, 1, function(x) any(unlist(x$d) %in% finalized_list)),]
#     a   b   c        d
# 1 100 400 500 300, 400

最新更新