R的新手我想创建一个函数来计算包含以下单词中的一个或多个的行数(" foo"," x",&# 34; y")来自一列。
然后我想用变量标记该行,例如" 1"。
我有一个如下所示的数据框: A->
id text time username
1 "hello x" 10 "me"
2 "foo and y" 5 "you"
3 "nothing" 15 "everyone"
4 "x,y,foo" 0 "know"
正确的输出应该是:
数:3 新数据框a2 - >
id text time username keywordtag
1 "hello x" 10 "me" 1
2 "foo and y" 5 "you" 1
3 "nothing" 15 "everyone"
4 "x,y,foo" 0 "know" 1
如何做到这一点的任何提示将不胜感激!
答案 0 :(得分:2)
以下是 base 和 qdap 的两种方法:
a <- read.table(text='id text time username
1 "hello x" 10 "me"
2 "foo and y" 5 "you"
3 "nothing" 15 "everyone"
4 "x,y,foo" 0 "know"', header=TRUE)
#Base
a$keywordtag <- as.numeric(grepl("\\b[foo]\\b|\\b[x]\\b|\\b[y]\\b", a$text))
a
#qdap
library(qdap)
terms <- termco(gsub("(,)([^ ])", "\\1 \\2", a$text),
id(a), list(terms = c(" foo ", " x ", " y ")))
a$keywordtag <- as.numeric(counts(terms)[[3]] > 0)
a
#output
## id text time username keywordtag
## 1 1 hello x 10 me 1
## 2 2 foo and y 5 you 1
## 3 3 nothing 15 everyone 0
## 4 4 x,y,foo 0 know 1
基本方法更加雄辩和简单。
#EDIT (从理查德那里借来我相信这是最普遍和最不可靠的):
words <- c("foo", "x", "y")
regex <- paste(sprintf("\\b[%s]\\b", words), collapse="|")
within(a,{
keywordtag = as.numeric(grepl(regex, a$text))
})
答案 1 :(得分:1)
您的问题归结为在多个分隔符上拆分字符串向量,并检查是否有任何令牌都在您的所需单词集中。您可以使用strsplit
拆分多个分隔符(我将使用逗号和空格,因为您的问题没有为您的问题指定完整的分隔符集),我将使用intersect
来检查如果它包含你的集合中的任何单词:
m <- c("foo", "x", "y")
a$keywordtag <- as.numeric(unlist(lapply(strsplit(as.character(a$text), ",|\\s"),
function(x) length(intersect(x, m)) > 0)))
a
# id text time username keywordtag
# 1 1 hello x 10 me 1
# 2 2 foo and y 5 you 1
# 3 3 exciting 15 everyone 0
# 4 4 x,y,foo 0 know 1
我已经包含了“令人兴奋的”,这是一个包含“x”的单词,但是这种方法没有将其列为匹配。
答案 2 :(得分:1)
这可能比我之前的回答更安全。
> string <- c("foo", "x", "y")
> a$keywordtag <-
(1:nrow(a) %in% c(sapply(string, grep, a$text, fixed = TRUE)))+0
> a
# id text time username keywordtag
# 1 1 hello x 10 me 1
# 2 2 foo and y 5 you 1
# 3 3 nothing 15 everyone 0
# 4 4 x,y,foo 0 know 1
答案 3 :(得分:0)
Tyler Rinker 的另一种回答方式:
within(a,{keywordtag = as.numeric(grepl("foo|x|y", fixed = FALSE, a$keywordtag))})