通过数据框应用

时间:2016-08-12 12:23:51

标签: r dataframe stringr

我有一个简单的数据框,有两列和两行。我试图遍历每一行,以找到第二列中不在第一列中的单词。样本数据:

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

因此,输出应该是添加到testdata的第三列,第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
}

我收到以下错误:

  

“参数”FUN“缺失,没有默认值”

你知道这个有什么好的解决方案吗?谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

尝试:

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

我希望这会有所帮助。