融化数据框,重塑高大的数据框架

时间:2016-01-19 17:40:13

标签: r dataframe melt

我有以下数据框(df),尽管我认为我无法解决如何执行以下操作:

输入:

id  business_id type                      date1     date2     date3
1   A1          Month                     13/10/13  13/09/13  13/08/13
1   A1          Total Net Deposits        1500      951       190
1   A1          Month end Bank Balance    729       650       164

预期产出:

id  business_id Month       Total Net Deposits  Month end Bank Balance 
1   A1          13/10/13    1500                729 
1   A1          13/09/13    951                 650
1   A1          13/09/13    190                 164

3 个答案:

答案 0 :(得分:5)

这是一个tidyr选项:

.so

如果您的列存储为因子,则会出现警告,但您可以忽略它。

您可以使用基础R(统计信息)和其他一些库中的library(tidyr) df %>% gather(date, val, date1:date3) %>% spread(key = type, val = val) # id business_id date Month Month end Bank Balance Total Net Deposits #1 1 A1 date1 13/10/13 729 1500 #2 1 A1 date2 13/09/13 650 951 #3 1 A1 date3 13/08/13 164 190 #Warning: #attributes are not identical across measure variables; they will be dropped reshape2data.table执行相同操作。

答案 1 :(得分:4)

我们可以使用base R

cbind(df1[1:2],setNames(as.data.frame(t(df1[-(1:3)])), df1$type))
#      id business_id    Month Total Net Deposits Month end Bank Balance
#date1  1          A1 13/10/13               1500                    729
#date2  1          A1 13/09/13                951                    650
#date3  1          A1 13/08/13                190                    164

答案 2 :(得分:3)

library(reshape2)
df.m<-melt(x,id.var=c("id", "business_id","type"))
dcast(df.m,id+business_id+variable~type)
如果你愿意的话,你可以摆脱变量“变量”。

  id business_id variable    Month MonthendBankBalance TotalNetDeposits
1  1          A1    date1 13/10/13                 729             1500
2  1          A1    date2 13/09/13                 650              951
3  1          A1    date3 13/08/13                 164              190