2016-08-12 41 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 

我希望這有助於。