合并数据帧,同时保持R的长度和其他值

时间:2016-09-01 12:21:53

标签: r dataframe merge

我想合并两个数据框: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

这可以轻松完成吗?

2 个答案:

答案 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))