我有一个数据集,如下所示:
cp<-data.frame("name"=c("billy", "jean", "jean", "billy","billy", "dawn", "dawn"),
"answer"=c("michael jackson is my favorite", "I like flowers", "flower is red","hey michael",
"do not touch me michael","i am a girl","girls have hair"))
每个名为 name 的变量都附加一个字符串,存储在变量 answer 中。我想知道 answer 变量中哪些特定单词,单词部分或整个句子,这对于 name 中的不同名称是常见的:
例如,名称"billy"
会与"michael"
相关联。
编辑:
包含以下变量的数据框,名为ddd
:
name: debby answer: "did you go to dallas?"
name: debby answer: "debby did dallas"
function(name=debby,data=ddd) {...} ,
,它给出了输出"did debby dallas"
。
答案 0 :(得分:3)
这是一个(不是非常有效)我使用pmatch
来匹配部分匹配的函数。它的问题是,它也会与a
和am
或i
和is
匹配,因为它们也非常接近。
freqFunc <- function(x){
temp <- tolower(unlist(strsplit(as.character(x), " ")))
temp2 <- length(temp)
temp3 <- lapply(temp, function(x){
temp4 <- na.omit(temp[pmatch(rep(x, temp2), temp)])
temp4[length(temp4) > 1]
})
list(unique(unlist(temp3)))
}
library(data.table)
setDT(cp)[, lapply(.SD, freqFunc), by = name, .SDcols = "answer"]
# name answer
# 1: billy michael
# 2: jean i,is,flower,flowers
# 3: dawn a,am,girl,girls
如果您对完全匹配感到满意,这可以非常简化并提高性能(我还添加了tolower
,因此它也会匹配不同的情况)
freqFunc2 <- function(x){
temp <- table(tolower(unlist(strsplit(as.character(x), " "))))
list(names(temp[temp > 1]))
}
library(data.table)
setDT(cp)[, lapply(.SD, freqFunc2), by = name, .SDcols = "answer"]
# name answer
# 1: billy michael
# 2: jean
# 3: dawn
答案 1 :(得分:1)
有了正确理解的警告,我认为这就是你在寻找的东西。然而,正如大卫所说,不处理复数词。这只是找到完全相同的单词。
billyAnswers<-cp$answer[cp$name=="billy"]
#output of billyAnswers
#[1] "michael jackson is my favorite" "hey michael"
#[3] "do not touch me michael"
现在我们得到所有的话
allWords<-unlist(strsplit(billyAnswer, " "))
#outputvof allWords
# [1] "michael" "jackson" "is" "my" "favorite" "hey"
# [7] "michael" "do" "not" "touch" "me" "michael"
我们可以找到常见的
common<-allWords[duplicated(allWords)]
#output of common
#[1] "michael" "michael"
当然有两个michaels因为在比利的答案中有多个michael实例!所以让我们再把它配对。
unique(common)
#[1] "michael"
然后你去,将它应用于所有名字,你就明白了。
对于牛仔和黎明,他们的答案中没有常用词,因此此方法返回两个长度为0的字符向量
#jean's words
#[1] "I" "like" "flowers" "flower" "is" "red"
#dawn's words
#[1] "i" "am" "a" "girl" "girls" "have" "hair"