将字符串中的单词与R中的变量匹配

时间:2014-09-17 14:08:57

标签: r string comparison

我有一个数据集,如下所示:

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"

2 个答案:

答案 0 :(得分:3)

这是一个(不是非常有效)我使用pmatch来匹配部分匹配的函数。它的问题是,它也会与aamiis匹配,因为它们也非常接近。

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"