【问题标题】:Merging dataframes by columns where some columns exist in both dataset but some do not按列合并数据框,其中一些列存在于两个数据集中,但有些不存在
【发布时间】:2013-09-14 00:16:40
【问题描述】:

假设您有两个数据集,xy

x=matrix(c(1,2,55,3,2,1,0,NA,NA,3,NA,333,NA,9,NA),5,3)
colnames(x)=c(1133131,12442141,20100063)
rownames(x)=c(1,2,3,4,5)

y=matrix(c(8,1,3,41,131,NA,4141,NA,124,NA,213,NA,128,NA,2,NA,1241,2),3,6)
colnames(y)=c(1133131,2422342,555555,33323242,20100063,23325600009)
rownames(y)=c(6,7,8)

我想合并它们,以便所有列都存在于最终数据集中,并且数据在存在的地方填写,NA 在不存在的地方填写。因此,如果另一个数据集中不存在一个,我希望该部分的所有值都是NA

所以基本上我希望最终输出是:

merged:     upc
    days    1133131, 12442141, 2422342, 555555, 33323242, 20100063, 23325600009
       1           1         1      NA
       2           2         0      NA
       3           55       NA      NA
       4           3        NA      NA            ...etc
       5           2         3      NA
       6           8        NA      41
       7           1        NA      131
       8           3        NA      NA

【问题讨论】:

  • 首先决定是否要合并数据框(如标题)或矩阵(来自示例)。
  • 行名在xy中是不同的;如果这将始终在您的数据集中发生,那么解决方案会更容易,实际上,在 R-lingo 中称为rbind 而不是merge 可能更好。你能澄清一下这些行名是否总是不同的吗?
  • 是的,它们总是不同的,但它们的宽度会不同,因此 rbind(x,y) 不会生成表格。

标签: r matrix merge na


【解决方案1】:

你可以使用 plyr.fill

library(plyr)

# With matrices
rbind.fill.matrix(x, y)

# With dataframes
rbind.fill(as.data.frame(x), as.data.frame(y))

【讨论】:

  • 这不是他们想要的。请注意,所需的输出只有一行对应于 days = 1。
  • @joran 其实我不确定。在我看来,天数对应于输入中的行名。值 1 one 在输入和所需输出的第 1133131 列中出现两次。
  • 我同意@zero323,这看起来就像他们想要的。可能取决于 xy 中唯一的行,但我的解决方案也是如此。
  • @zero323,也许添加其中之一的输出,这也会有所帮助
  • 那是我的错,如果行名与行号不同,就像它们是日期一样?
【解决方案2】:

这是一个base 的方法,只需创建一个新矩阵并适当地填充它。这取决于 xy 中唯一的行。

cs <- sort(unique(c(colnames(x), colnames(y))))
rs <- c(rownames(x), rownames(y))
xy <- array(NA, dim=c(length(rs), length(cs)), dimnames=list(days=rs, upc=cs))
xy[1:nrow(x), colnames(x)] <- x
xy[nrow(x) + 1:nrow(y), colnames(y)] <- y
xy
##     upc
## days 1133131 12442141 20100063 23325600009 2422342 33323242 555555
##    1       1        1       NA          NA      NA       NA     NA
##    2       2        0      333          NA      NA       NA     NA
##    3      55       NA       NA          NA      NA       NA     NA
##    4       3       NA        9          NA      NA       NA     NA
##    5       2        3       NA          NA      NA       NA     NA
##    6       8       NA      128          NA      41       NA   4141
##    7       1       NA       NA        1241     131      213     NA
##    8       3       NA        2           2      NA       NA    124

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-20
    • 2020-11-05
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 2022-01-22
    相关资源
    最近更新 更多