我有一个数据表,如下所示:
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,就可以得到任何帮助。
答案 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