使用R中另一个data.frame的两列对一个data.frame重新排序
我在R中有两个data.frames,其中一个有两列,另一个有三列,其中两列在两个帧之间是公共的。框架的行数相同。下面提供帧a和b的示例。我需要做的是使用a中的行顺序对b中的行重新排序。请注意,在帧b中,前两列id和lob的任何唯一组合都将与val列中的唯一值相关联。这里给出的id和lob列是一个factor和一个character,但我希望有一个适用于任何数据类型的解决方案使用R中另一个data.frame的两列对一个data.frame重新排序,r,R,我在R中有两个data.frames,其中一个有两列,另一个有三列,其中两列在两个帧之间是公共的。框架的行数相同。下面提供帧a和b的示例。我需要做的是使用a中的行顺序对b中的行重新排序。请注意,在帧b中,前两列id和lob的任何唯一组合都将与val列中的唯一值相关联。这里给出的id和lob列是一个factor和一个character,但我希望有一个适用于任何数据类型的解决方案 注意,如果我们考虑一个框架A只有ID列,而框架B只有ID和VAR列的情况,那么我会用类似于的方式来完成这一情况。 b[m
注意,如果我们考虑一个框架A只有ID列,而框架B只有ID和VAR列的情况,那么我会用类似于
的方式来完成这一情况。b[match(a$id,b$id),]
不幸的是,当我需要按两列排序时,我不确定如何完成同样的事情
a:
b:
我想得到这个:
id lob val
1 1+ X 1
2 3 X 5
3 2 X 4
4 1 X 3
5 1 Y 2
6 1+ Y 9
7 1+ X 1
8 3 X 5
9 3 X 5
尝试使用“粘贴”在合并函数调用中组合id和lob
b[match(paste(a$id,a$lob), paste(b$id,b$lob)),]
id lob val
1 1+ X 1
4 3 X 5
7 2 X 4
8 1 X 3
9 1 Y 2
2 1+ Y 9
1.1 1+ X 1
4.1 3 X 5
4.2 3 X 5
尝试使用“粘贴”在合并函数调用中组合id和lob
b[match(paste(a$id,a$lob), paste(b$id,b$lob)),]
id lob val
1 1+ X 1
4 3 X 5
7 2 X 4
8 1 X 3
9 1 Y 2
2 1+ Y 9
1.1 1+ X 1
4.1 3 X 5
4.2 3 X 5
以下是另一种方法,只要a和b中的配对完全匹配:
b[order(b$id,b$lob), ][ order(order(a$id,a$lob)), ]
第一次使用order按id和lob列对b数据帧进行排序,然后第二次使用set 2 orders表示对b行进行重新排序,排序后会将a重新排序为其原始顺序。这里有另一种方法,只要a和b中的配对完全匹配:
b[order(b$id,b$lob), ][ order(order(a$id,a$lob)), ]
第一次使用order按id和lob列对b数据帧进行排序,第二次使用set 2 orders表示对b的行进行重新排序,排序后会将a重新排序回其原始顺序。它定义得好吗?id、lob组合似乎不是唯一定义行的。Aniko-可以有重复的行,但这不应该是一个问题,就像您希望对具有重复值的数字向量进行排序一样。注意,对于任何给定的id,lob tuple只有一个val值;i、 你不能有1+,X,5和1+,X,3。如果不是这样的话,这将是一个问题。它甚至定义得很好吗?id、lob组合似乎不是唯一定义行的。Aniko-可以有重复的行,但这不应该是一个问题,就像您希望对具有重复值的数字向量进行排序一样。注意,对于任何给定的id,lob tuple只有一个val值;i、 你不能有1+,X,5和1+,X,3。如果不是这样的话,这将是一个问题。您创建假连接的风险很小。例如:a.id=ab,a.lob=c,b.id=a,b.lob=bc。但只有当你不知道你的数据时才会发生。谢谢布莱恩,你解决了我的问题。为了更加安全,我们可以添加一个独特的分隔符来处理Marek提到的情况。创建虚假连接的风险很小。例如:a.id=ab,a.lob=c,b.id=a,b.lob=bc。但只有当你不知道你的数据时才会发生。谢谢布莱恩,你解决了我的问题。为了更加安全,我们可以添加一个独特的分隔符来处理Marek提到的情况。