2014-01-22 16 views
1

我有兩個數據幀合併/與來自另一數據幀colmn值替換行名稱

 
>cat a1.txt 
"501" 5.7916 6.9861 
"502" 24.9444 18.45 
"503" 4 4.7222 5.5 
"505" 5 5.2777 5.3 

>cat a2.txt 
501 "alex" 
502 "brian" 
503 "romeo" 
504 "tango" 
505 "zee" 

我希望能夠從a2.txt替換a1.txt第一列中,用相應的值(查找)

我想要的東西,喜歡 -

 
alex 5.7916 6.9861 
brian 24.9444 18.45 
romeo 4 4.7222 5.5 
zee 5 5.2777 5.3 

我tried-

a1t <- read.table('a1.txt') 
a2t <- read.table('a2.txt') 

a1t 

    V1  V2  V3 
1 501 5.7916 6.9861 
2 502 24.9444 18.4500 
3 503 4.0000 4.7222 
4 505 5.0000 5.2777 
> a2t 
    V1 V2 
1 501 alex 
2 502 brian 
3 503 romeo 
4 504 tango 
5 505 zee 
> merge(x=a1t, y=a2t,by='V1', all.x=TRUE) 
    V1 V2.x  V3 V2.y 
1 501 5.7916 6.9861 alex 
2 502 24.9444 18.4500 brian 
3 503 4.0000 4.7222 romeo 
4 505 5.0000 5.2777 zee 

但這並不代替第1列。它增加了一個額外的列。 我怎樣才能得到上述所需的格式?

如果我的a1.txt不平衡怎麼辦?即所有行中的列數不一致?

+0

您可以使用'match'或將其轉換爲'factor'並替換'levels'。 – user1436187

+0

作爲參考:這是一個[有很多方法可以在R中執行此操作的問題](http://stackoverflow.com/questions/1299871/how-to-join-data-frames-in-r-inner-outer-左右)。這些包括以下函數/包:'merge(),plyr,data.table,sqldf' – marbel

回答

2

你可以只選擇你想要的東西:

#you are getting all lines and columns 4, 2 and 3  
merge(x=a1t, y=a2t,by='V1', all.x=TRUE)[,c(4,2,3)] 

#this will give the data.frame you wanted, that is: 

    V2.y V2.x  V3 
1 alex 5.7916 6.9861 
2 brian 24.9444 18.4500 
3 romeo 4.0000 4.7222 
4 zee 5.0000 5.2777 

或者,如果您反轉合併,你可以排除第一列:

merge(x=a2t, y=a1t,by='V1', all.y=TRUE)[,-c(1)] 

##This will give: 
V2.x V2.y  V3 
1 alex 5.7916 6.9861 
2 brian 24.9444 18.4500 
3 romeo 4.0000 4.7222 
4 zee 5.0000 5.2777 

你問:

如果我的a1.txt不平衡怎麼辦?即所有行中的列數不一致?

我不確定你是什麼意思,但如果你的意思是你沒有從某些人的某些變量的觀察,只需加上NA。

+0

我不能這樣做 - [,c(4,2,3)]由於列的列表不同,並且它是一個長列表。數據就像 - 亞歷克斯的專欄包含了他最昂貴的10款玩具的價格。布賴恩的五大最昂貴的玩具價格。我希望這也能澄清不平衡的部分。 – Harpreet

+0

一個簡單的方法是倒置並排除第一列'merge(x = a2t,y = a1t,by ='V1',all.y = TRUE)[, - c(1)]'。 –

+0

如果你想保留所有的元素(不平衡的情況下),你應該使用all = TRUE,這會給你NA的地方,你沒有匹配。 –

相關問題