【问题标题】:How to merge multiple table or matrix into one in R code如何在R代码中将多个表或矩阵合并为一个
【发布时间】:2014-10-01 09:09:25
【问题描述】:

这是我的第一个问题,和R代码有关。

我有 50 (10X10) 个数据帧的情况。这些是不同日期的项目和计数。两个矩阵的简化示例:

  > Day1
     name count
  1 Item1   231
  2 Item2   222
  3 Item3   453

  > dim(Day1)
  [1] 3 2

  > str(Day1)

  'data.frame': 3 obs. of  2 variables:
   $ name : Factor w/ 3 levels "Item1","Item2",..: 1 2 3
   $ count: num  231 222 453

  > Day2
   name count
  1 Item1   111
  2 Item4   765
  3 Item3   212

所以合并应该是这样的:

     > Total
     name  D1  D2
  1 Item1 231 111
  2 Item2 222   0
  3 Item3 453 212
  4 Item4   0 765
  >

因此,从本质上讲,我拥有的矩阵',每一个在当天可能有也可能没有相同的项目名称,但目标是将它们放在一个矩阵/视图中,他们会看到项目计数如何上升/下降等. [也欢迎提出绘图、图表等以从数据中显示有用信息的建议]

【问题讨论】:

  • 请在 R 中显示您的矩阵的精确表示,例如,将dput(yourmatrix1) 的输出添加到您的问题中。目前尚不清楚您的数据是哪种形式。
  • @Hasan Mahmud 如果是data.frame,可以`merge(Day1, Day2, by="name", all=TRUE)`
  • 欢迎来到 SO。但这是极少数情况下您会立即(而且很好!)回答searching
  • @Hasan Mahmud 我猜你为 Item3 & Item4 显示的预期结果是 revese

标签: r merge dataframe


【解决方案1】:

试试:

library(plyr)
nm1 <- ls(pattern="^Day")
nm2 <- gsub("^(.).*(\\d)$", "\\1\\2", nm1)


res <- join_all(Map(function(x,y) {names(x)[2] <- y;x},
               mget(nm1), nm2), type="full")
res[is.na(res)] <- 0
res
#    Name  D1   D2
#1 Item1  231  111
#2 Item2  222   0
#3 Item3  453  212
#4 Item4   0   765

数据

Day1 <- structure(list(Name = c("Item1", "Item2", "Item3"), Count = c(231L, 
222L, 453L)), .Names = c("Name", "Count"), class = "data.frame", row.names = c(NA, 
-3L))

Day2 <-  structure(list(Name = c("Item1", "Item4", "Item3"), Count = c(111L, 
765L, 212L)), .Names = c("Name", "Count"), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

    【解决方案2】:

    您不需要包裹。用akrun的数据:

    datlist <- mget(ls(pattern="^Day"))
    
    dat <- Reduce(function(DF1, DF2) merge(DF1, DF2, by = "Name", all=TRUE), datlist)
    names(dat)[-1] <- names(datlist)
    dat[,-1] <- lapply(dat[,-1], function(x) {
      x[is.na(x)] <- 0
      x
    })
    #   Name Day1 Day2
    #1 Item1  231  111
    #2 Item2  222    0
    #3 Item3  453  212
    #4 Item4    0  765
    

    【讨论】:

      【解决方案3】:

      试试:

      dflist = list(Day1, Day2)
      dflist
      for(i in 1:length(dflist)) {
          dflist[[i]]$day = paste0('Day',i)
      
      }
      merged = dflist[[1]]
      for(i in 2:length(dflist)){
          merged = rbind(merged, dflist[[i]])
      }
      
      merged
         Name Count  day
      1 Item1   231 Day1
      2 Item2   222 Day1
      3 Item3   453 Day1
      4 Item1   111 Day2
      5 Item4   765 Day2
      6 Item3   212 Day2
      
      dcast(merged, Name~day, value.var="Count")
         Name Day1 Day2
      1 Item1  231  111
      2 Item2  222   NA
      3 Item3  453  212
      4 Item4   NA  765
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2018-05-03
        • 2016-03-18
        • 1970-01-01
        相关资源
        最近更新 更多