假设我有以下数据集,其行为类似于键
我有另外一些包含许多列的数据,其中2列是x和y。我想创建一个与键匹配的列值,例如
我只能在匹配一列时使用匹配才能使其正常工作。如何扩展到多列匹配?
答案 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
默认情况下,这将加入列名称的交集,如第一个示例(x
,y
,value
)。此外,您可以使用data.frame
指定要使用by=
的哪些列,如第二个示例所示。或者,您可以使用by.x=
和/或by.y=
获得更具体的信息。见?merge
。
修改:
问题是df.key
包含x=1, y=1
为TRUE
的两行,因此df.add
中x=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