我想知道是否有更好的方法將兩個data.frames合併爲一個,將rownames當作一個列對待,然後通過該列與其他一些data.frame進行合併。我知道我可以做到以下幾點如何通過另一個data.frame的某個列在rowname上進行合併?
df1$rn <- row(df1)
all <- merge(df1,df2, by.x="rn", by.y="some_column")
我的意思是產生這是沒有必要的冗餘數據(如rownames列)。那麼,更聰明的方法是什麼?
我想知道是否有更好的方法將兩個data.frames合併爲一個,將rownames當作一個列對待,然後通過該列與其他一些data.frame進行合併。我知道我可以做到以下幾點如何通過另一個data.frame的某個列在rowname上進行合併?
df1$rn <- row(df1)
all <- merge(df1,df2, by.x="rn", by.y="some_column")
我的意思是產生這是沒有必要的冗餘數據(如rownames列)。那麼,更聰明的方法是什麼?
您可以使用「row.names」或0作爲行名稱的索引。
使用authors
和books
從merge
幫助一個例子:
rownames(authors) <- authors$surname
merge(authors, books, by.x = "row.names", by.y = "name")
「的明智之選」真的取決於你的數據,這是我們所沒有的。但
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
對我的恥辱,我看看幫助文件,但只是在例子不耐煩。對不起。 thx雖然幫助!看到差異真的很有趣。也許假設有一個聰明的方法來做到這一點,是比沒有看到幫助更大的錯誤。 – 2010-10-26 09:23:25
@ ran2:作爲一般性評論:一旦你進入Perl-land,你知道總有不止一種方法可以做到這一點。回到R國後,你很快就會意識到還有辦法可以做到但不應該做。 – 2010-10-26 09:39:33
@Roger Pate:爲什麼不是這個基礎? – 2010-10-28 07:59:55
什麼是R的「基礎」? [元標記不鼓勵。](http://meta.stackexchange.com/questions/51627/should-we-permanently-remove-the-subjective-tag/60015#60015) – 2010-10-28 08:02:02
Thx指向我。我不知道那件事。即使我對你的問題有一個明確的(主觀的)答案,將來也不會有meta標籤。我用於標記r基礎知識,當我覺得我可能在幫助或谷歌找到了答案,但沒有找到正確的方式,例如,因爲很難搜索運營商。所以基本上這意味着我意識到這是一個簡單的問題,但我希望能夠在問題中提供一些即時幫助和額外信息或討論。 – 2010-10-28 08:12:47