R:按行计算单词出现次数并创建变量
我是R新手。我想创建一个函数来计算一列中包含以下一个或多个单词(“foo”、“x”、“y”)的行数 然后我想用一个变量标记该行,例如“1” 我有一个如下所示的数据框: a-> 正确的输出应为: 计数:3 新数据帧 a2->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
任何关于如何做到这一点的提示都将不胜感激 这里有两种方法,分别是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)
基本方法更加雄辩和简单
#编辑(借用Richard的话,我认为这是最普遍、最不可靠的):
words这里有两种方法,分别是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)
基本方法更加雄辩和简单
#编辑(借用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