假设我有一个数据帧,其中包含一个名为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