用 R 排列包含相同名称的多列字符值

问题描述 投票:0回答:1

我使用 R 并且水平合并多个数据集(按列),其中每个数据集都有一个相同的列。例如,考虑

`df1=data.frame('name'=c('9504','07123','40355','59003'),
             'age 16'=c(21,22,23,25), 
              'income 43_'=c(3,4,7,2))`

 `df2=data.frame('name'=c('9504','40355','59003','07123'),
             'new 21'=c(21,22,23,25),
              'GDP 98'=c(3,4,7,2) )`

这里,两个数据集具有相同的“名称”列。我水平合并两个数据集,我有

`df=data.frame('name'=c('9504','07123','40355','59003'),
             'age 16'=c(21,22,23,25),
              'income 43'=c(3,4,7,2),
             'name'=c('9504','40355','59003','07123'),
             'new 21'=c(21,22,23,25),
              'GDP 98'=c(3,4,7,2))`

请注意,合并不是我的问题。 它被视为给定的。给定数据框 df,我想排列“名称”列的值(按升序或升序排列) 降序排列) 以便在“名称”列中具有相同的顺序,当然还要相应地重新排列其他列

比如说我想要

`dfN1=data.frame('name'=c('07123','40355','59003','9504'),
             'age 16'=c(22,23,25,21),
              'income 43'=c(4,7,2,3),
             'name'=c('07123','40355','59003','9504'),
             'new 21'=c(25,22,23,21),
              'GDP 98'=c(2,4,7,3))`

 name age.16 income.43 name.1 new.21 GDP.98
1 07123     22         4  07123     25      2
2 40355     23         7  40355     22      4
3 59003     25         2  59003     23      7
4  9504     21         3   9504     21      3

我不想处理 df1 和 df2 而是直接 df 得到'dfN1'

所以我尝试了

`dfN<-df[with(df, order(name)),]`     
   name age.16 income.43 name.1 new.21 GDP.98
2 07123     22         4  40355     22      4
3 40355     23         7  59003     23      7
4 59003     25         2  07123     25      2
1  9504     21         3   9504     21      3

但正如您所看到的,只有前两列得到了正确纠正,而后两列则没有得到正确纠正。所以dfN和dfN1不一样,这就是我想要实现的。

我能做什么?

请注意,实际上我在获取 df 之前合并了许多数据帧。所以我真正的 df 包含 很多次“名称”这个词,而且“名称”列之间还有更多变量。因此,更通用的代码会很有帮助。

r sorting multiple-columns
1个回答
0
投票

由于您的数据集共享一个“键”列,因此这是使用 df1 和 df2 连接的自然位置:

library(dplyr)
df1 |>
  left_join(df2, join_by(name))

结果

   name age.16 income.43_ new.21 GDP.98
1  9504     21          3     21      3
2 07123     22          4     25      2
3 40355     23          7     22      4
4 59003     25          2     23      7

如果您出于某种原因需要从

df
开始(如果可能的话我会避免它),您可以使用
df
的子集手动到达同一位置:

left_join(df[,1:3], df[,4:6], join_by(name == "name.1"))
© www.soinside.com 2019 - 2024. All rights reserved.