我想合并两个数据框:X长度为10(例如),Y为长度为3但具有相似的行名称。我只想保留X的长度,但在3个相应的行中使用B的值,而将其他10 - 3 = 7的值设置为零。
例如,
X<-data.frame(c(1,2,3,4,5,6,7,8,9,10))
rownames(X)<-c("a","b","c","d","e","f","g","h","i","j")
Y<-data.frame(c(20,30,40))
rownames(Y)<-c("d","f","h")
给我这些数据框
X Y
a 1 d 20
b 2 f 30
c 3 h 40
d 4
e 5
f 6
g 7
h 8
i 9
j 10
我现在想要这个
Z
a 0
b 0
c 0
d 20
e 0
f 30
g 0
h 40
i 0
j 0
这可以轻松完成吗?
答案 0 :(得分:1)
我们可以使用match
来查找在X中找到的Y的行名称的位置.Y的值被放入向量并与0连接。我们使用nomatch参数填写0什么时候没有比赛。这将z作为向量返回:
Z <- c(unlist(Y, use.names=FALSE), 0)[match(row.names(X), row.names(Y), nomatch=4L)]
Z
[1] 0 0 0 20 0 30 0 40 0 0
获取data.frame
Z <- data.frame(Z)
答案 1 :(得分:1)
dplyr对left_join有很好的选择。它的代码很容易阅读和解释。
UITextView
我在XandY中提供了所有列,以显示所有计算和结果。
X<-data.frame(V1 = c(1,2,3,4,5,6,7,8,9,10),
KEY = c("a","b","c","d","e","f","g","h","i","j"),
stringsAsFactors = F)
Y<-data.frame(V2 = c(20,30,40),
KEY = c("d","f","h"),
stringsAsFactors = F)
library(dplyr)
XandY <- X %>%
left_join(Y, by = "KEY") %>%
mutate(Z = ifelse(is.na(V2), 0, V2))