通过数据框申请

Apply through dataframe

我有一个包含两列和两行的简单数据框。我试图遍历每一行以查找第二列中不在第一列中的单词。示例数据:

testdata <- data.frame(rbind(one = c("mango rasberry","mango rasberry blueberry"), 
                   two = c("kiwi strawberry","kiwi strawberry passionfruit")))

因此,输出应该是添加到测试数据的第三列,其中包含第 1 行中的 "Blueberry" 和第 2 行中的 "passionfruit"。

这是我目前拥有的功能:

extract <- function(input) {
  extra<- apply(x, function(x) x[setdiff(unlist(str_split(input[,1]," ")), unlist(str_split(input[,2]," ")))])
  extra
}

我收到以下错误:

"argument "FUN" is missing, with no default "

你知道解决这个问题的好办法吗?谢谢您的帮助。

尝试:

testdata <- data.frame(rbind(one = c("mango rasberry","mango rasberry blueberry"), 
                             two = c("kiwi strawberry","kiwi strawberry passionfruit")), stringsAsFactors = F)

testdata$differences <- apply(testdata, 1, function(x) {
    x1 <- unlist(strsplit(x[1], split = " "))
    x2 <- unlist(strsplit(x[2], split = " "))
    ifelse(length(x1) > length(x2), base::setdiff(x1,x2), base::setdiff(x2,x1))
})

问题是 setdiff 从第一个参数开始并从那里开始工作。如果它查看第一个参数并发现它的所有元素在第二个参数中都匹配,那么它不会认为存在差异。因此,在这种情况下,元素数量最多的向量应该是第一个参数。

您也可以通过计算 union()intersect() 的差异来完成,如下所示:

apply(testdata, 1, function(x) {
    x1 <- unlist(strsplit(x[1], split = " "))
    x2 <- unlist(strsplit(x[2], split = " "))
    base::setdiff(base::union(x1,x2), base::intersect(x1,x2))
})

期望的输出:

X1              X2                           differences 
mango rasberry  mango rasberry blueberry     blueberry   
kiwi strawberry kiwi strawberry passionfruit passionfruit

希望对您有所帮助。