将行名称与另一个数据框中的列值合并/替换

时间:2014-01-22 02:32:07

标签: r join merge dataframe

我有两个数据框

>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"

我希望能够替换a1.txt中的第一列,并使用来自a2.txt(查找)的相应值

我想要像 -

这样的东西
alex 5.7916 6.9861 
brian 24.9444 18.45
romeo 4 4.7222 5.5 
zee 5 5.2777 5.3

我试过了 -

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

但这并没有取代第一栏。它增加了一个额外的列。 如何获得上述所需格式?

如果我的a1.txt不平衡怎么办?即它中的列数在所有行中是不一致的?

1 个答案:

答案 0 :(得分: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。