2016-01-24 72 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'的性能。 –