2010-10-26 61 views
2

我想知道是否有更好的方法將兩個data.frames合併爲一個,將rownames當作一個列對待,然後通過該列與其他一些data.frame進行合併。我知道我可以做到以下幾點如何通過另一個data.frame的某個列在rowname上進行合併?

df1$rn <- row(df1) 
all <- merge(df1,df2, by.x="rn", by.y="some_column") 

我的意思是產生這是沒有必要的冗餘數據(如rownames列)。那麼,更聰明的方法是什麼?

+0

@Roger Pate:爲什麼不是這個基礎? – 2010-10-28 07:59:55

+0

什麼是R的「基礎」? [元標記不鼓勵。](http://meta.stackexchange.com/questions/51627/should-we-permanently-remove-the-subjective-tag/60015#60015) – 2010-10-28 08:02:02

+0

Thx指向我。我不知道那件事。即使我對你的問題有一個明確的(主觀的)答案,將來也不會有meta標籤。我用於標記r基礎知識,當我覺得我可能在幫助或谷歌找到了答案,但沒有找到正確的方式,例如,因爲很難搜索運營商。所以基本上這意味着我意識到這是一個簡單的問題,但我希望能夠在問題中提供一些即時幫助和額外信息或討論。 – 2010-10-28 08:12:47

回答

2

您可以使用「row.names」或0作爲行名稱的索引。

使用authorsbooksmerge幫助一個例子:

rownames(authors) <- authors$surname 
merge(authors, books, by.x = "row.names", by.y = "name") 
1

「的明智之選」真的取決於你的數據,這是我們所沒有的。但

df1 <- data.frame(
    X1 = 1:10, 
    id = letters[1:10] 
) 

df2 <- data.frame(
    X2 = 10:1, 
    X3 = letters[11:20] 
) 
rownames(df2) <- df1$id 
df2 <- df2[sample.int(10),] 

cbind(df1,df2[match(df1$id,rownames(df2)),]) 

編輯:Vitoshka的答案是你正在尋找的。如果我都不屑看的?merge的幫助文件,我就已經知道,以及...

我離開這裏我的解決方案,以防萬一有人需要迅速替代合併:

> system.time(replicate(1000,cbind(df1,df2[match(df1$id,rownames(df2)),]))) 
    user system elapsed 
    0.57 0.00 0.57 
> system.time(replicate(1000,merge(df1,df2,by.x="id",by.y="row.names"))) 
    user system elapsed 
    2.36 0.02 2.37 
+0

對我的恥辱,我看看幫助文件,但只是在例子不耐煩。對不起。 thx雖然幫助!看到差異真的很有趣。也許假設有一個聰明的方法來做到這一點,是比沒有看到幫助更大的錯誤。 – 2010-10-26 09:23:25

+1

@ ran2:作爲一般性評論:一旦你進入Perl-land,你知道總有不止一種方法可以做到這一點。回到R國後,你很快就會意識到還有辦法可以做到但不應該做。 – 2010-10-26 09:39:33

相關問題