我有一个简单的数据框,有两列和两行。我试图遍历每一行,以找到第二列中不在第一列中的单词。样本数据:
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“缺失,没有默认值”
你知道这个有什么好的解决方案吗?谢谢您的帮助。
答案 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
我希望这会有所帮助。