将 ifelse 函数应用于变长 [r] 的字符向量

sapply an ifelse function on character vectors of varying length [r]

非常感谢对我的问题的任何帮助,谢谢。

我有一个数据框,其中第二列有 'selected' 从第一列(在前面的步骤中)提取的单词,现在经常(但不总是)将它们留在不同的 运行 命令 。我现在需要以与在 'wordsDF$original'.

列中相同的 运行 顺序获取 'wordsDF$subbed' 列中的单词

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

我正在尝试使用 sapply() 创建第三列 (wordsDF$reord),这将是 'wordsDF$subbed' 的单词,按照它们在 'wordsDF$original' 中找到的顺序排列。尽管我被困在如何沿着 wordsDF$original 字符串的所有单词传递 sapply 函数,这些单词的长度各不相同(即每个字符串中的单词数)。我能想到的实现这一点的唯一方法是使用 stringr 函数 str_detect 检测(从左到右)wordsDF$original 中的每个单词是否在 wordsDF$subbed 中,如果 'yes' 提取它word into wordsDF$reord(粘贴任何已提取的内容)。如果 'no',列 wordsDF$reord 保持不变。

我的解决方案如下,但是,它被硬编码为仅检查和提取第一个单词。谁能告诉我如何沿着每个字符串传递函数吗?或者是否有更好的方法重新排序 wordsDF$subbed 并消除对 wordsDF$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))

提前致谢!

这是一个可能的基础 R 解决方案,它在两个分割向量上运行 mapply 并且 returns 两者之间的匹配词以正确的顺序包装到 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"