对数据进行分组,然后将值分配给存储在字符串中的变量名 - R

时间:2013-08-12 05:03:14

标签: r

我正在尝试将此活动从excel / SQL迁移到R而且我被卡住了 - 非常感谢任何帮助。谢谢!

数据格式: 有独特的客户ID。每个客户在不同年份都有不同的团体购买。

目标: 对于每个客户ID - 获得一行输出。使用存储在列中的变量名称和创建列 - 为每列分配金额总和。创建一个类似的列,并根据是否存在收入分配为1或0。

来源:

   Cust_ID Group Year Variable_Name   Amount
1        1     A 2009        A_2009     2000
2        1     B 2009        B_2009      100
3        2     B 2009        B_2009      300
4        2     C 2009        C_2009       20
5        3     D 2009        D_2009   299090
6        3     A 2011        A_2011 89778456
7        1     B 2011        B_2011      884
8        1     C 2010        C_2010    34894
9        3     D 2010        D_2010   389849
10       2     A 2013        A_2013      742
11       1     B 2013        B_2013    25661
12       2     C 2007        C_2007      393
13       3     D 2007        D_2007       23

输出:

Cust_ID A_2009  B_2009  C_2009  D_2009  A_2011  ….  A_2009_P    B_2009_P    
1   sum of amount       ..              1   0   ….
2                                   
3                                   

dput原始数据:

structure(list(Cust_ID = c(1L, 1L, 2L, 2L, 3L, 3L, 1L, 1L, 3L, 
2L, 1L, 2L, 3L), Group = c("A", "B", "B", "C", "D", "A", "B", 
"C", "D", "A", "B", "C", "D"), Year = c(2009L, 2009L, 2009L, 
2009L, 2009L, 2011L, 2011L, 2010L, 2010L, 2013L, 2013L, 2007L, 
2007L), Variable_Name = c("A_2009", "B_2009", "B_2009", "C_2009", 
"D_2009", "A_2011", "B_2011", "C_2010", "D_2010", "A_2013", "B_2013", 
"C_2007", "D_2007"), Amount = c(2000L, 100L, 300L, 20L, 299090L, 
89778456L, 884L, 34894L, 389849L, 742L, 25661L, 393L, 23L)), .Names = c("Cust_ID", 
"Group", "Year", "Variable_Name", "Amount"), class = "data.frame", row.names = c(NA, 
-13L))

1 个答案:

答案 0 :(得分:2)

一个选项:

intm <- as.data.frame.matrix(xtabs(Amount ~ Cust_ID + Variable_Name,data=dat))
result <- data.frame(aggregate(Amount~Cust_ID, data=dat,sum),intm,(intm > 0)+0 )

结果(删节):

  Cust_ID   Amount A_2009   A_2011  ... A_2009.1 A_2011.1
1       1    65539   4000        0  ...        1        0
2       2     1455      0        0  ...        0        0
3       3 90467418      0 89778456  ...        0        1

如果名称是一个问题,可以通过以下方式轻松修复:

names(res) <- gsub("\\.1","_P",names(res))