【问题标题】:Merging two DataFrames matching rows/columns合并两个匹配行/列的DataFrame
【发布时间】:2021-08-15 05:39:51
【问题描述】:

给定两个不同维度的数据框,我如何才能将一个合并到另一个之上,以保持较大 df 的维度并在需要的地方插入较小的数据。

x = matrix(data = 1:4, nrow = 20, ncol = 22)

y = matrix(data = NA, nrow = 26, ncol = 26)

像这样的东西,其中 Y 是一个完整的空白矩阵,X 是一个实际数据点的矩阵。我怎样才能合并它们,以便 X 的数据覆盖到 Y 的矩阵上

我尝试过类似的东西

Z<- merge(Y, X, by = "Country", all.x= TRUE)

但最终发生的事情是我得到一个列大小加倍的 DF,并将数据附加到 Y DF 的末尾。

我也试过了

    library(dplyr)
    Z<- merge(Y, X, by = "Country", all.x = T)
      Z%>% 
        mutate(Afghanistan = ifelse(is.na(Afghanistan.x), Afghanistan.x, Afghanistan.y)) %>% 
           select(-Afghanistan.y, -Afghanistan.x)

作为参考,我的表格的行/列名称是国家/地区。此方法有效,但一次只能替换 1 列,是否可以循环正确输入所有列的所有数据?

【问题讨论】:

  • merge 用于基于一个或多个公共列组合两个data.frames。当您说“一个在另一个之上” 时,对我来说这听起来像rbind(或dplyr::bind_rows,尽管这又是仅用于帧)。无论如何,您的xy 是矩阵(没有列名),然后您尝试在列名"Country" 上使用merge 两个对象XY,所以我不太确定我们应该在这里处理什么。
  • 我的示例 x 和 y 是我应该创建数据框的矩阵,这是我的错误

标签: r loops dplyr merge


【解决方案1】:

您可以使用x 的维度对y 进行子集化并分配 -

y[1:nrow(x), 1:ncol(x)] <- x
y

【讨论】:

    【解决方案2】:

    按照@ronak-shah 给出的答案,如果您的y 数据框具有x 的所有行和列名称(加上更多不属于x 的部分),那么您可以只需将行名和列名作为子集,即可将x 放入y

    创建示例矩阵:

    x <- as.data.frame(matrix(data = 1:3, nrow = 5, ncol = 6))
    y <- as.data.frame(matrix(data = NA, nrow = 10, ncol = 10))
    

    重命名一些行和列以创建我们的示例:

    row.names(x)=c("a", "b", "c", "d", "e")
    colnames(x)=c("V1", "V2", "V3", "V5", "V6", "V8")
    row.names(y)=c("1",  "2",  "a",  "b",  "5",  "c",  "7",  "d",  "9",  "e")
    

    现在,在y 中拟合x

    y[row.names(x), colnames(x)] <- x
    

    这将填充y 中与x 中的行名和列名匹配的元素,但保持其他元素不变。

    【讨论】:

      猜你喜欢
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 2019-02-28
      • 2019-09-12
      • 2021-12-23
      • 2017-12-23
      • 2016-01-17
      相关资源
      最近更新 更多