我使用 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 包含 很多次“名称”这个词,而且“名称”列之间还有更多变量。因此,更通用的代码会很有帮助。
由于您的数据集共享一个“键”列,因此这是使用 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"))