使用另一个数据框中的列对数据框进行排序

3

I have the folowing data.frames:

d1 <- data.frame(A=c(-1,-1,1,1,-1,-1,1,1), B=c(-1,1,-1,1,-1,1,1,-1), Y=c(2,3,4,5,8,9,10,11))
d2 <- data.frame(A=c(1,1,-1,-1,1,-1,1,-1), B=c(-1,1,1,-1,-1,1,1,-1))

我想要将列Y添加到d2数据框中。我尝试使用merge函数,但这会使数据框的行数加倍。
我还尝试使用ordermatch函数按照第二个数据框的列对第一个数据框进行排序:
d1[order(match(
  paste(d1$A,d1$B),
  paste(d2df$A,d2df$B))
),]

但它不能正常工作,我不知道为什么。

你的目标是排序,还是仅仅将Y添加到d2中? - Dominic Comtois
1
请添加预期输出。行“-1 -1”在列“Y”中的值为“2”和“8”,你该如何选择?d1和d2的行数相同吗? - zx8754
我想保留这两行。是的,d1和d2有相同数量的行。 - Marta
我不太确定您期望的输出是什么。请查看dplyr库中的mutating joins https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf - ArunK
这正是我想要的,Olli J. - Marta
显示剩余2条评论
2个回答

3
如果我理解得正确,这将给你想要的结果:
# Sort d1 and d2 with columns A and B
d1 <- d1[order(d1$A,d1$B),]
d2 <- d2[order(d2$A,d2$B),]

# Copy Y from d1 to d2
d2$Y <- d1$Y

# Restore original order in d1 and d2
d1 <- d1[order(rownames(d1)),]
d2 <- d2[order(rownames(d2)),]

d2$Y
#[1]  4  5  3  2 11  9 10  8

0

如果d1d2的行数不同:

chosen <- numeric(length = nrow(d1))
choices <- paste(d1$A, d1$B)

for(i in seq(nrow(d1))){
  chosen[i] <- match(paste(d2$A[i], d2$B[i]), choices)
  choices[chosen] <- 0
  }

d2$Y <- d1[chosen, "Y"]
d2$Y
#[1]  4  5  3  2 11  9 10  8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接