比方说,我有一个数据框,其中包含一个名为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), ]
但这也不起作用。
有想法吗?
答案 0 :(得分:1)
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
答案 1 :(得分:1)
首先,让我们创建一个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