如果列表中有任何vector值,则返回true

时间:2018-08-15 18:07:01

标签: r

比方说,我有一个数据框,其中包含一个名为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), ] 

但这也不起作用。

有想法吗?

2 个答案:

答案 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