R:按行计算单词出现次数并创建变量

R:按行计算单词出现次数并创建变量,r,count,R,Count,我是R新手。我想创建一个函数来计算一列中包含以下一个或多个单词(“foo”、“x”、“y”)的行数 然后我想用一个变量标记该行,例如“1” 我有一个如下所示的数据框: a-> 正确的输出应为: 计数:3 新数据帧 a2-> 任何关于如何做到这一点的提示都将不胜感激 这里有两种方法,分别是base和qdap: a <- read.table(text='id text time username 1 "hello x" 10 "me" 2

我是R新手。我想创建一个函数来计算一列中包含以下一个或多个单词(“foo”、“x”、“y”)的行数

然后我想用一个变量标记该行,例如“1”

我有一个如下所示的数据框: a->

正确的输出应为:

计数:3 新数据帧

a2->


任何关于如何做到这一点的提示都将不胜感激

这里有两种方法,分别是baseqdap

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)
基本方法更加雄辩和简单

#编辑(借用Richard的话,我认为这是最普遍、最不可靠的):


words这里有两种方法,分别是baseqdap

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)
基本方法更加雄辩和简单

#编辑(借用Richard的话,我认为这是最普遍、最不可靠的):


words您的问题归结为在多个分隔符上拆分字符串向量,并检查所需单词集中是否有任何标记。您可以使用
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

m您的问题归结为在多个分隔符上拆分字符串向量,并检查您所需的单词集中是否有任何标记。您可以使用
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

m这可能比我之前的答案安全得多

> 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
>字符串a$keywordtag a
#id文本时间用户名关键字标签
#你好x10我1
#2富和y 5你1
#3什么都没有15每个人0
#4 x,y,foo 0知道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
>字符串a$keywordtag a
#id文本时间用户名关键字标签
#你好x10我1
#2富和y 5你1
#3什么都没有15每个人0
#4 x,y,foo 0知道1

泰勒·林克回答的另一种方式:


在(a,{keywordtag=as.numeric(grepl(“foo | x | y”,fixed=FALSE,a$keywordtag)))中)
泰勒·林克回答的另一种方式:



在(a,{keywordtag=as.numeric(grepl(“foo | x | y”,fixed=FALSE,a$keywordtag))}

到目前为止,您尝试了哪些代码来生成这个新变量?您的
文本中单词之间的有效分隔符是什么?到目前为止,单词似乎可以用空格或逗号分隔。是否还有其他有效分隔符?分隔符可以是空格和逗号(或其他标点符号)。到目前为止,您尝试了哪些代码来生成此新变量?您的
文本中的单词之间的有效分隔符是什么?到目前为止,单词似乎可以用空格或逗号分隔。还有其他有效的分隔符吗?分隔符可以是空格和逗号(或其他标点符号)。请注意,正如@Tylerlinker的解决方案一样,这将匹配“令人兴奋”一词,即使(根据我的解释)这不是所需的功能,因为OP希望匹配单词。有人知道如何进行模糊匹配吗?因此,为了避免任何标点符号、间距等?
fixed=TRUE
会注意这一点。它只会精确地匹配
字符串的元素,以增强关键字标签,而不是将字符串的每个成员标记为唯一标识符?有人可以添加注释说明这是如何工作的吗?我将其理解为:逻辑测试,应用于dataframe,其中字符串在文本列中匹配。然后转换为整数。请注意,与@Tylerlinker的解决方案一样,这将匹配单词“令人兴奋”,即使(根据我的解释)这不是所需的功能,因为OP希望匹配单词。有人知道如何进行模糊匹配吗?因此,为了避免任何标点符号、间距等?
fixed=TRUE
会注意这一点。它只会精确地匹配
字符串的元素,以增强关键字标签,而不是将字符串的每个成员标记为唯一标识符?有人可以添加注释说明这是如何工作的吗?我将其理解为:逻辑测试,应用于dataframe,其中字符串在文本列中匹配。然后转换为整数。我在
qdap
方法中添加了一个不太理想的
gsub
fix。我喜欢这里的基本方法。如果我们需要每个单词链接到一个数字?(例如,foo=1,x=2,等等)这听起来像是一个新问题。如果是,请问一个新问题。我在
qdap
方法中添加了一个不太理想的
gsub
修复。我喜欢这里的基本方法。如果我们需要每个单词链接到一个数字?(例如,foo=1,x=2,等等)这听起来像是一个新问题。如果是,请提出一个新问题。我添加了一个更好的qdap和base方法,另一个方法也包括Richards,使我认为是最普遍的解决方案。我添加了一个更好的qdap和base方法,另一个方法也包括Richards,使我认为是最普遍的解决方案。
words <- c("foo", "x", "y")
regex <- paste(sprintf("\\b[%s]\\b", words), collapse="|")
within(a,{
    keywordtag = as.numeric(grepl(regex, a$text))
})
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
> 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