根据分组

时间:2017-12-30 13:46:25

标签: r dplyr data-manipulation

我有以下格式的数据框

Id <- c(101,102,103,101,103,103,102,101,103,102)
Service <- c('A','B','A','C','A','A','B','C','A','B')
Type <- c('C','I','C','I','C','C','C','I','I','C')
Channel <- c('ATM1','ATM2','ATM1','Teller','Teller','ATM2','ATM1','ATM1','ATM2','Teller')
amount <- c(11,34,56,37,65,83,26,94,34,55)

df <- data.frame(Id,Service,Channel,Type,amount)

表格格式中的df

Id Service Channel Type amount
101       A    ATM1    C     11
102       B    ATM2    I     34
103       A    ATM1    C     56
101       C  Teller    I     37
103       A  Teller    C     65
103       A    ATM2    C     83
102       B    ATM1    C     26
101       C    ATM1    I     94
103       A    ATM2    I     34
102       B  Teller    C     55

我可以使用amount列作为df %>% group_by(Id) %>% summarise(total = sum(amount)) %>% as.data.frame

汇总我的数据
 Id total
101   142
102   115
103   238

如何使用分类列(服务/类型/频道)和group_by(Id)以类似方式汇总数据?我知道我们可以在这里使用table(),但我正在尝试创建一个数据框,我可以将其用于进一步分析,例如聚类。

1 个答案:

答案 0 :(得分:2)

Id可以概括的方式重构分类变量的一种方法是创建虚拟编码变量,其中1表示存在,0表示不存在。然后,通过Id得到每个类别的计数(即ATM1使用的次数)。

我们使用dummies包来创建虚拟编码变量。

Id <- c(101,102,103,101,103,103,102,101,103,102)
Service <- c('A','B','A','C','A','A','B','C','A','B')
Type <- c('C','I','C','I','C','C','C','I','I','C')
Channel <- c('ATM1','ATM2','ATM1','Teller','Teller','ATM2','ATM1','ATM1','ATM2','Teller')
amount <- c(11,34,56,37,65,83,26,94,34,55)

df <- data.frame(Id,Service,Channel,Type,amount)
library(dummies)
df <- dummy.data.frame(df,names=c("Service","Type","Channel"))
aggregate(. ~ Id,data=df,"sum")

...和输出:

> aggregate(. ~ Id,data=df,"sum")
   Id ServiceA ServiceB ServiceC ChannelATM1 ChannelATM2 ChannelTeller TypeC
1 101        1        0        2           2           0             1     1
2 102        0        3        0           1           1             1     2
3 103        4        0        0           1           2             1     3
  TypeI amount
1     2    142
2     1    115
3     1    238
> 

我们将结果解释如下。

Id 101使用Service A一次,Service C两次,ATM1一次,Teller一次,Type I一次,Type C两次,共计142次。