检查哪些单元格(包含列表)包含某个值?

时间:2019-03-06 03:58:50

标签: r list

在R中,我想搜索一列中的每个单元格,该列包含一系列列表。我想为包含某个值的单元格返回索引(或返回T / F)。

例如-我创建了这个测试数据框。

test <- data.frame(rows = 1:5, values = 0)
test$values <- list(1, c(2,3), c(4:6), 4, 0)

尝试使用以下方法查询它:

test[4 %in% test$values,] 

在此示例中,我想返回包含值4的单元格(因此第3行和第4行应为true)。我该怎么做呢?我当前的查询仅返回一个TRUE,因为它只是测试整个列(而不是该列中的每个单元格)。

我过去使用for循环(大致如下)解决了这个问题。例如:

test$result <- FALSE
for (i in 1:nrow(test)){
    if (4 %in% test$values[i]){
        test$result[i] <- TRUE
    }
}

我真的不希望每次需要这样的查询时都将其作为解决方案。

2 个答案:

答案 0 :(得分:1)

由于它是一个列表,因此您需要使用sapply / lapply

遍历它
test$result <- sapply(test$values, function(x) 4 %in% x)

test
#  rows  values result
#1    1       1  FALSE
#2    2    2, 3  FALSE
#3    3 4, 5, 6   TRUE
#4    4       4   TRUE
#5    5       0  FALSE

如果您想对那些行进行子集化

test[sapply(test$values, function(x) 4 %in% x), ]

#  rows  values
#3    3 4, 5, 6
#4    4       4

答案 1 :(得分:0)

map包中的purrr函数非常适合处理嵌套数据,如下所示:

purrr::map_lgl(test$values, ~ 4 %in% .)
[1] FALSE FALSE  TRUE  TRUE FALSE