我真的找不到一种优雅的方式来实现这一点,请帮忙。
我有一个 DT
data.table:
name,value
"lorem pear ipsum",4
"apple ipsum lorem",2
"lorem ipsum plum",6
并基于列表
Fruits <- c("pear", "apple", "plum")
我想创建一个因子类型列。name,value,factor
"lorem pear ipsum",4,"pear"
"apple ipsum lorem",2,"apple"
"lorem ipsum plum",6,"plum"
我想这是基本的,但我有点卡住了,这是我得到的程度:
DT[grep("apple", name, ignore.case=TRUE), factor := as.factor("apple")]
提前致谢。
最佳答案
您可以使用正则表达式对其进行矢量化,例如通过使用 gsub()
:
设置数据:
strings <- c("lorem pear ipsum", "apple ipsum lorem", "lorem ipsum plum")
fruit <- c("pear", "apple", "plum")
现在创建一个正则表达式
ptn <- paste0(".*(", paste(fruit, collapse="|"), ").*")
gsub(ptn, "\\1", strings)
[1] "pear" "apple" "plum"
正则表达式的工作原理是用
|
分隔每个搜索元素,嵌入在括号内:ptn
[1] ".*(pear|apple|plum).*"
要在数据表中执行此操作,根据您的问题,就像这样简单:
library(data.table)
DT <- data.table(name=strings, value=c(4, 2, 6))
DT[, factor:=gsub(ptn, "\\1", strings)]
DT
name value factor
1: lorem pear ipsum 4 pear
2: apple ipsum lorem 2 apple
3: lorem ipsum plum 6 plum