2012-06-25 38 views
2
> imqd = read.csv("csv/quest/IMQ.csv") 
> demod = read.csv("csv/DEMO.csv") 
> mcqd = read.csv("csv/quest/MCQ.csv") 
> 
> length(demod) 
[1] 145 
> length(demod[[1]]) 
[1] 9965 
> length(mcqd) 
[1] 168 
> length(mcqd[[1]]) 
[1] 9493 
> length(imqd) 
[1] 5 
> length(imqd[[1]]) 
[1] 9965 
> 
> mydata = merge(imqd, demod) 
> length(mydata) 
[1] 148 
> length(mydata[[1]]) 
[1] 9965 

到目前爲止,這麼好。但是,如果我嘗試將mcqd與任何東西合併,我會丟失大部分行,即使數據看起來不錯。R - 無法合併CSV,出於某種原因

> intersect(intersect(names(imqd), names(mcqd)), names(demod)) 
[1] "X" "seqn" 

> finaldata = merge(mydata, mcqd) 
> length(finaldata) 
[1] 314 
> length(finaldata[[1]]) 
[1] 18 

爲什麼現在只有18行?

如果你想在家玩,你可以get the csv files here

+1

我想也許'merge'並不意味着你認爲這意味着什麼。它默認在所有匹配列上進行內部連接。任何不匹配的東西都會丟失,就像在sql中一樣。你可能想調查'by'和'all'的參數。 – joran

+0

所有三個文件都有兩列幾乎完全相同。 –

回答

1

merge正在嘗試僅返回那些與每個公共列匹配的行。 看着MCQ.csv,我們看到,20行開始了:

"19",20,2,NA, 

merge不會使用此列。兩個公共列(第一列和第二列)都不匹配每個文件。要合併的數據的pk顯然是seqn。所以,我們可以簡單地使用by參數merge

> finaldata = merge(mydata, mcqd, by="seqn") 
+1

正如我懷疑的那樣,您只需仔細查看第一/第二欄中的值即可。特別要檢查一下MCQ。值19被跳過,這意味着對於所有剩餘的值,它與其他值不同。 – joran

+1

更重要的是,加入時包含行號列會迫使問題出現。 – joran

+0

現貨上,如果您喜歡,您可以回答我接受;並且,我將刪除這一個。 –