【问题标题】:Merge/replace row name with colmn value from another data frame用另一个数据框中的列值合并/替换行名
【发布时间】:2014-01-22 02:32:06
【问题描述】:

我有两个数据框

>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 >猫 a2.txt 501“亚历克斯” 第502章 503“罗密欧” 504“探戈” 第505章

我希望能够将 a1.txt 中的第一列替换为 a2.txt(lookup) 中的对应值

我想要类似的东西-

亚历克斯 5.7916 6.9861 布赖恩 24.9444 18.45 罗密欧4 4.7222 5.5 泽 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 不平衡怎么办?即其中的列数在所有行中都不一致?

【问题讨论】:

标签: r join merge dataframe


【解决方案1】:

你可以选择你想要的:

#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。

【讨论】:

  • 我不能这样做- [,c(4,2,3)] 因为列的列表各不相同,而且列表很长。数据类似于 - Alex 的列包含他的 10 个最昂贵玩具的价格。布赖恩的前 5 个最昂贵的玩具价格。我希望这也能澄清不平衡的部分。
  • 一个简单的方法是反转然后排除第一列merge(x=a2t, y=a1t,by='V1', all.y=TRUE)[,-c(1)]
  • 如果您想保留所有元素(不平衡的情况),您应该使用 all=TRUE,这将为您提供没有匹配项的 NA。
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
相关资源
最近更新 更多