2016-08-12 19 views
0

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

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

因此,输出应该是第三列加入到含有“蓝莓”在第1行“西番莲”行TESTDATA 2

这是我有这么的功能远:

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 "

你知道有什么好的SOLUT离子这将是?感谢您的帮助。

+0

纠错的功能: 提取< - 函数(输入){ 额外< - 应用(输入,函数(X)×[setdiff(不公开(str_split(输入[1],”“)),不公开(str_split(input [,2],“”)))]) extra } –

+2

'apply'取轴参数:1表示行,2表示列。这应该在'input'和'function(x)'之间。 – Abdou

+0

谢谢,阿卜杜。但是,当我添加它时,它仍然输出空字符向量(这次没有错误,但仍然不是正确的输出) extract < - function(input){0} [setdiff(unlist(str_split(input [,1],“”)),unlist(str_split(input [,2],“”)))]) extra } –

回答

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 

我希望这有助于。