Как получить строки с элементами в столбце списка - PullRequest
2 голосов
/ 10 октября 2019

У меня есть datatable , как показано ниже:

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"))
  )

Из этого я хотел получить строки, которые содержат «дерево» в столбце строки списка. Поэтому я попытался

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 и 2. Любая помощь приветствуется.

Ответы [ 3 ]

3 голосов
/ 10 октября 2019

Или просто

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\")"

Это означает, что он также будет соответствовать другим словам с tree внутри IF, поскольку @RonakShah напомнил мне, что вы не используете границы слов \b.

2 голосов
/ 10 октября 2019

Поскольку string - это список, вам нужно sapply или какой-либо другой способ перебора каждого списка.

library(data.table)
dt[sapply(string, function(x) any(x == "tree"))]

#   id                  string
#1:  1         tree,house,star
#2:  2 house,tree,dense forest
1 голос
/ 10 октября 2019

Мы также можем использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...