根据月份从数据集的集合创建矩阵

时间:2015-10-25 18:54:24

标签: r

我将数据存储为名为A,B,C,......

的数据帧集合
if(number > max)
    max = number;
if(number < min)
    min = number;

注意:C用于表示空数据框

问题是建立一个像:

这样的矩阵
A <- structure(list(Mes = c("Feb 2015", "Jun 2015", "Jul 2015", "Aug 2015", "Sep 2015", "Oct 2015", "Nov 2015"), Valor = c(73.98, 1013.21, 3209.38, 4168.41, 5233.48, 1313.83, 622.78)), .Names = c("Mes","Valor"), class = "data.frame", row.names = c("1", "2", "3","4", "5", "6", "7"))

B <- structure(list(Mes = c("Aug 2015", "Sep 2015", "Oct 2015"), Valor = c(1391.72, 761.15, 107.58)), .Names = c("Mes", "Valor"), class = "data.frame", row.names = c("1", "2", "3"))

C <- structure(list(Mes = c("Aug 2015"), Valor = c(0)), .Names = c("Mes", "Valor"), class = "data.frame", row.names = c("1"))

1 个答案:

答案 0 :(得分:1)

我们可以将数据集放在list中,使用rbindlist中的data.table创建单个data.table,然后重新设置“长”字样。广泛的&#39;使用dcast

library(data.table)#v1.9.6+
dcast(rbindlist(list(A,B))[, ind:= 1:.N, Mes], ind~Mes, 
                value.var='Valor', fill=0)
#   ind Aug 2015 Feb 2015 Jul 2015 Jun 2015 Nov 2015 Oct 2015 Sep 2015
#1:   1  4168.41    73.98  3209.38  1013.21   622.78  1313.83  5233.48
#2:   2  1391.72     0.00     0.00     0.00     0.00   107.58   761.15

在devel版本即v1.9.7中,我们也可以使用rowid创建序列列

dcast(rbindlist(list(A, B)), rowid(Mes)~Mes, value.var='valor', fill=0) 

更新

使用新数据集

 DT <- rbindlist(list(A, B,C))[, ind:= 1:.N, Mes]
 dcast(DT, ind~Mes, value.var='Valor', fill=0)
  #    ind Aug 2015 Feb 2015 Jul 2015 Jun 2015 Nov 2015 Oct 2015 Sep 2015
  #1:   1  4168.41    73.98  3209.38  1013.21   622.78  1313.83  5233.48
  #2:   2  1391.72     0.00     0.00     0.00     0.00   107.58   761.15
  #3:   3     0.00     0.00     0.00     0.00     0.00     0.00     0.00

如果我们需要matrix输出,也可以使用base R选项完成此操作。我们使用ave创建序列列,然后使用xtabs重新整形。

df1 <- transform(do.call(rbind, list(A, B)), ind= ave(seq_along(Mes), Mes, FUN=seq_along))
xtabs(Valor~ind+Mes, df1)
#   Mes
#ind Aug 2015 Feb 2015 Jul 2015 Jun 2015 Nov 2015 Oct 2015 Sep 2015
#  1  4168.41    73.98  3209.38  1013.21   622.78  1313.83  5233.48
#  2  1391.72     0.00     0.00     0.00     0.00   107.58   761.15

数据

A <- structure(list(Mes = c("Feb 2015", "Jun 2015", "Jul 2015", "Aug 2015", 
"Sep 2015", "Oct 2015", "Nov 2015"), Valor = c(73.98, 1013.21, 
3209.38, 4168.41, 5233.48, 1313.83, 622.78)), .Names = c("Mes", 
"Valor"), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6", "7"))

B <- structure(list(Mes = c("Aug 2015", "Sep 2015", "Oct 2015"), Valor = c(1391.72, 
761.15, 107.58)), .Names = c("Mes", "Valor"), class = "data.frame", row.names = c("1", 
"2", "3"))