2016-01-24 42 views
1

对我的问题的任何帮助将非常感谢,谢谢。sapply一个ifelse函数对不同长度的字符向量[r]

我有一个数据框,其中第二列已经从第一列(在前面的步骤)中提取的“已选”单词现在经常(但并非总是)将它们留在不同的运行顺序中。我现在需要按照与'wordsDF $ original'列中的相同的运行顺序来获取'wordsDF $ subbed'列中的单词。

我已经发布了一个小子集来说明第四列(wordsDF $ target),我已经完成了手工展示我的目标。

我正在尝试创建第三列(wordsDF $ reord),它将以'wordsDF $ subbed'的顺序在'wordsDF $ original'中使用sapply()发现。我仍然坚持如何将字符串字符串中所有单词的长度(即每个字符串中单词的数量)的所有单词都传递给函数。我能想到的唯一方法是通过使用stringr函数str_detect来检测(从左到右)words DF $ original中的每个单词是否在words DF $ subbed中,并且如果'yes'将该单词提取为words DF $ reord(粘贴任何已经提取的东西)。如果'否',列字DF $ reord保持不变。

我的解决方案如下,但是,它是硬编码只检查和提取的第一个字。任何人都可以告诉我我是如何沿着每个字符串传递函数的吗?或者有没有更好的方法,重新排序wordsDF $ subbed并且否定了需要单词DF $ reord?

library(stringr) 

original = c("heat pump only for 100/150l geyser r410a gas", 
     "alliance allwh 5_dcpt_0kw heat pump only for 200/25", 
     "alliance allwinteg 190l integrated heat pump and cylinder r134a gas", 
     "aquatouch bt10 cp bottle trap 32x40", 
     "aquatouch pop32lux cp slotted pop up basin waste 32mm", 
     "aquatouch ci15 cp angle regulating valve only 15x15") 

subbed = c("heat pump", 
     "heat pump", 
     "and cylinder heat pump", 
     "bottle trap", 
     "basin pop up waste", 
     "valve") 


wordsDF = as.data.frame(cbind(original, subbed)) 
wordsDF$original = as.character(wordsDF$original) 
wordsDF$subbed = as.character(wordsDF$subbed) 
wordsDF$reord = character(nrow(wordsDF)) 
wordsDF$target = c("heat pump","heat pump", 
       "heat pump and cylinder", 
       "bottle trap","pop up basin waste", 
       "valve") 

# my attempted solution... 
wordsDF$reord = sapply(wordsDF$original, function(x) ifelse(
      test = str_detect(wordsDF$subbed, word(wordsDF$original, 1,1)), 
      yes = paste(wordsDF$reord, str_extract(wordsDF$subbed, word(wordsDF$original, 1,1))), 
      no = wordsDF$reord)) 

在此先感谢!

回答

2

下面是它运行mapply在两个分裂向量和以正确的顺序缠绕成paste

Rematch <- function(x, y) paste(y[sort(match(x, y))], collapse = " ") # Define an helper functions 
mapply(Rematch, strsplit(subbed, "\\s+"), strsplit(original, "\\s+")) 
# [1] "heat pump"    "heat pump"    "heat pump and cylinder" "bottle trap"   "pop up basin waste"  
# [6] "valve" 
+1

即已经牢牢击中钉的头部返回两个之间的匹配的单词的可能的基础R溶液。许多人非常感谢@大卫。 – CallumH

+0

你也可以定义'复赛< - 函数(x,y)粘贴(x [match(y,x,nomatch = 0)],collapse =“”)'。另外,如果总是有一个空格,你可以在'strsplit'调用(而不是'“\\ s +”')中增加指定'sep =“”'和'fixed = TRUE'的性能。 –