我使用 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 包含许多次单词“name”,而且我在“name”列之间还有更多变量。因此,更通用的代码会有所帮助。
由于您的数据集共享一个“关键”列,因此这是一个使用 df1 和 df2 进行连接的自然地方:
结果
如果由于某种原因您需要从开始
df
(如果可能的话我会避免这样做),您可以使用以下手动子集到达同一位置df
:同样,每次都以连接的方式执行此操作更为简单,这样每个添加的表都会添加变量,并由“名称”等关键列统一。保持数据“整洁”,其中每行代表一个观察结果,将使您的分析更加简单、可靠和可靠。
https://vita.had.co.nz/papers/tidy-data.pdf
需要注意的主要陷阱是确保您的键是唯一的;如果不是,一行可能会与多行匹配,每次都会无意中增加输出。
multiple
的参数left_join
提供了避免这种情况的选项,或者您可以执行汇总步骤以确保要连接的表中每行的键列都是唯一的。