【问题标题】:Merging data frames by row names and making sure the rows are aligned按行名合并数据框并确保行对齐
【发布时间】:2018-03-09 10:35:21
【问题描述】:

这是一个示例代码:

a <- c(1,2,3,4,5)
b <- c(3,4,5)
a_df <- as.data.frame(a)
b_df <- as.data.frame(b)
colnames(a_df) <- "Original"
colnames(b_df) <- "New"

total <- merge(x=a_df, y=b_df, by=0, all=TRUE)

当我运行总计时,这就是我得到的:

  Row.names Original New
1         1        1   3
2         2        2   4
3         3        3   5
4         4        4  NA
5         5        5  NA

怎么能让total变成这样?

  Row.names Original New
1         1        1  NA
2         2        2  NA
3         3        3   3
4         4        4   4
5         5        5   5

第二个例子:

A <- c('c','d','f','k','j')
B <- c('d','k','j')
A_df <- as.data.frame(A)
B_df <- as.data.frame(B)
colnames(A_df) <- "Original"
colnames(B_df) <- "New"

total <- merge(x=A_df, y=B_df, by=0, all=TRUE)

结果:

  Row.names Original  New
1         1        c    d
2         2        d    k
3         3        f    j
4         4        k <NA>
5         5        j <NA>

我正在寻找的是:

  Row.names Original  New
1         1        c <NA>
2         2        d    d
3         3        f <NA>
4         4        k    k
5         5        j    j

提前致谢!

【问题讨论】:

  • 得到的输出是正确的。 b_df 中的元素 3 具有行名 '1',作为其第一个元素。与a_df 中的元素1 匹配。 b_df 中的“缺失”条目是 row.names 45
  • 谢谢!但是我怎样才能获得一个新的输出,其中 Original 和 New 中的“3”都在同一行?同样,所有“4”都在同一行?请记住,Original 和 New 可能包含字符数据,在这种情况下,所有“c”都应该在同一行,所有“j”都应该在同一行,等等......任何想法都值得赞赏!
  • 您可以按列匹配,即match(a_df, b_df, by.x='Original', by.y='New', all.x=TRUE)。但我不知道你在同一行上所有的'c',所有的'j'是什么意思。请相应更新您的问题。
  • 运行 'match(a_df, b_df, by.x='Original', by.y='New', all.x=TRUE)' 结果: Original 1 2 3 4 5 --这不是我要找的。我已经更新了问题以包含更多示例。谢谢!
  • 您可以在合并调用之前执行row.names(B_df) &lt;- match(B_df[[1]], A_df[[1]]),但我认为通常不鼓励以这种方式使用行名...

标签: r merge


【解决方案1】:

如果您使用 OriginalNew 作为匹配变量,但希望将这两个变量都保留在生成的合并对象中,那么一种解决方案是创建一个用于合并的新变量。

示例 1:

a <- data.frame(Original = c(1,2,3,4,5))
b <- data.frame(New = c(3,4,5))

a$match = a$Original
b$match = b$New

merge(x=a, y=b, by="match", all=T)

示例 2:

A <- data.frame(Original = c('c','d','f','k','j'))
B <- data.frame(New = c('d','k','j'))

A$match = A$Original
B$match = B$New

merge(x=A, y=B, by="match", all=T)

【讨论】:

    猜你喜欢
    • 2014-05-02
    • 2018-01-29
    • 1970-01-01
    • 2018-09-26
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    相关资源
    最近更新 更多