R基于多列匹配

时间:2014-12-12 20:44:20

标签: r dataframe matching

假设我有以下数据集,其行为类似于键

  • x y value
  • 1 2 10
  • 1 1 20
  • 2 1 30
  • 1 1 20
  • 2 3 200

我有另外一些包含许多列的数据,其中2列是x和y。我想创建一个与键匹配的列值,例如

  • x y值和其他列
  • 1 1 20
  • 2 1 30
  • 2 3 300

我只能在匹配一列时使用匹配才能使其正常工作。如何扩展到多列匹配?

1 个答案:

答案 0 :(得分:2)

您可以使用merge,如@MrFlick建议:

df.key <- data.frame(
  x=c(1,1,2,1,2),
  y=c(2,1,1,1,3),
  value=c(10,20,30,20,200))
##
df.add <- data.frame(
  x=c(1,2,2),
  y=c(1,1,3),
  value=c(20,30,300),
  a=rnorm(3),
  b=rpois(3,0))
##
> merge(
    x=df.key,
    y=df.add)
  x y value         a b
1 1 1    20 0.9246104 0
2 1 1    20 0.9246104 0
3 2 1    30 0.2685016 0
##
> merge(
    x=df.key,
    y=df.add,
    by=c("x","y"))
  x y value.x value.y          a b
1 1 1      20      20  0.9246104 0
2 1 1      20      20  0.9246104 0
3 2 1      30      30  0.2685016 0
4 2 3     200     300 -0.4174230 0

默认情况下,这将加入列名称的交集,如第一个示例(xyvalue)。此外,您可以使用data.frame指定要使用by=的哪些列,如第二个示例所示。或者,您可以使用by.x=和/或by.y=获得更具体的信息。见?merge

修改:

问题是df.key包含x=1, y=1TRUE的两行,因此df.addx=1,y=1的行必须在联接中重复为了保留df.key中的数据。我不确定如何优雅地进行这种调整(例如通过指定merge的某些参数),但这是一种方法:

R> merge(
    x=df.key[!duplicated(df.key[,c(1:2)]),],
    y=df.add)
  x y value          a b
1 1 1    20 -1.0185211 0
2 2 1    30  2.7507656 0
3 2 3   200  0.3986168 0