如何在R代码中将多个表或矩阵合并为一个

时间:2014-10-01 09:09:26

标签: r merge dataframe

这是我的第一个问题,它与R coode有关。

我的情况是我有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
  >

所以从本质上讲,矩阵'我有,每一个可能有或没有相同的项目名称,但目标是让他们在一个矩阵/视图中,他们看到项目如何计数上升/下降等。 [建议使用图表,图表等来显示数据中的有用信息]

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

你不需要包裹。使用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

答案 2 :(得分:0)

尝试:

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