如何在列表列中获取包含元素的行

时间:2019-10-10 07:31:31

标签: r data.table stringi

我有一个数据表,如下所示:

library(data.table)

dt <- data.table(
  id = c(1:3),
  string = list(c("tree", "house", "star"),  
                c("house", "tree", "dense forest"), 
                c("apple", "orange", "grapes"))
  )

由此,我想获取列表字符串列中包含“ tree”的行。 所以我尝试了

dt["tree" %in% string]
Empty data.table (0 rows) of 2 cols: id,string


dt["tree" %in% unlist(string)]
   id                  string
1:  1         tree,house,star
2:  2 house,tree,dense forest
3:  3     apple,orange,grapes

我不确定我做错了哪一部分,我只需要返回ID 1和ID 2,就可以得到任何帮助。

3 个答案:

答案 0 :(得分:3)

或者只是

library(data.table)
dt[grep("\\btree\\b", string)]

   id                  string
1:  1         tree,house,star
2:  2 house,tree,dense forest

您的方法似乎有问题,就是%in%在列表上不起作用

"tree" %in% dt$string[1]
[1] FALSE

grep()grepl()接受可以强制转换为字符向量的所有内容

grepl("tree", dt$string[1])
[1] TRUE

as.character(dt$string[1])
[1] "c(\"tree\", \"house\", \"star\")"

这意味着它还将IF中与tree的其他单词匹配为@RonakShah 提醒我您不要使用单词边界\b

答案 1 :(得分:2)

由于public static Func<TResult?> ToFuncClass<TResult>(this Action action) where TResult : class => () => { action(); return null; } ; public static Func<TResult?> ToFuncStruct<TResult>(this Action action) where TResult : struct => () => { action(); return null; } ; 是一个列表,因此您需要string或其他方式来遍历每个列表。

sapply

答案 2 :(得分:1)

我们还可以使用str_detect中的stringr

library(dplyr)
library(stringr)
dt %>%
   filter(str_detect(string, "\\btree\\b"))
#   id                    string
#1  1         tree, house, star
#2  2 house, tree, dense forest

或在Map中使用data.table

dt[unlist(Map(`%in%`, "tree", string))]
#   id                  string
#1:  1         tree,house,star
#2:  2 house,tree,dense forest