【问题标题】:Insert NA-rows in data frame according to rownames of other data frame根据其他数据框的行名在数据框中插入 NA 行
【发布时间】:2017-11-09 15:25:36
【问题描述】:

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

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 循环来解决这个问题,但我确信一定有一个更加自动化的方法。

【问题讨论】:

    标签: r dataframe data-manipulation


    【解决方案1】:

    我们可以使用函数union%in%intersect 来查找常见的行名,如果NA 数据帧的行与行名匹配,则将其分配给数据集的值

    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
    

    【讨论】:

    • 非常感谢您的完美回答!
    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2012-06-09
    • 2020-02-18
    相关资源
    最近更新 更多