在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
}
}
我真的不希望每次需要这样的查询时都将其作为解决方案。
答案 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