根据其他数据框

时间:2017-11-09 15:25:36

标签: r dataframe data-manipulation

我有2个具有不同rownames的数据框,例如:

df1 <- data.frame(A = c(1,3,7,1,5), B = c(5,2,9,5,5), C = c(1,1,3,4,5))
df2 <- data.frame(A = c(4,3,2), B = c(4,4,9), C = c(3,9,3))
rownames(df2) <- c(1, 3, 6)

> df1
  A B C
1 1 5 1
2 3 2 1
3 7 9 3
4 1 5 4
5 5 5 5

> df2
  A B C
1 4 4 3
3 3 4 9
6 2 9 3

我需要在两个数据帧中为仅存在于一个数据帧中的每一行插入NA行。在给定的示例中:

> df1
  A  B  C
1 1  5  1
2 3  2  1
3 7  9  3
4 1  5  4
5 5  5  5
6 NA NA NA

> df2
  A  B  C
1 4  4  3
2 NA NA NA
3 3  4  9
4 NA NA NA
5 NA NA NA
6 2  9  3

我将不得不使用不同的数据帧多次执行此操作,因此我需要一种自动化的方法来执行此操作。我试图用不同的if / else循环解决问题,但我确信必须有更多的自动化方式。

1 个答案:

答案 0 :(得分:2)

我们可以使用函数union%in%intersect来查找公共rownames,并为NA数据框的行分配数据集的值(如果它与rownames匹配

un1 <- union(rownames(df1), rownames(df2))
d1  <- as.data.frame(matrix(NA, ncol = ncol(df1), 
        nrow = length(un1), dimnames = list(un1, names(df1))))
d2 <- d1
d1[rownames(d1) %in% rownames(df1),]  <- df1
d2[rownames(d2) %in% rownames(df2),] <- df2
d2
#   A  B  C
#1  4  4  3
#2 NA NA NA
#3  3  4  9
#4 NA NA NA
#5 NA NA NA
#6  2  9  3