重塑和聚合数据表

时间:2015-07-23 17:05:36

标签: r data.table aggregate reshape tidyr

我问了一个非常相似的问题,因为我还没有完全掌握tidyr或重塑我不得不问另一个问题。我有一个包含重复id值的数据表(见下文):

id  Product NI  
1   Direct Auto 15  
2   Direct Auto 15  
3   Direct Auto 15  
4   Direct Auto 15  
5   Direct Auto 15  
6   Direct Auto 15  
6   Mortgage    50  
9   Direct Auto 15  
10  Direct Auto 15  
11  Direct Auto 15  
12  Direct Auto 15  
13  Direct Auto 15  
14  Direct Auto 15  
15  Direct Auto 15  
16  Direct Auto 15  
1   Mortgage    50  
5   Personal    110  
19  Direct Auto 15  
20  Direct Auto 15  
1   Direct Auto 15 

我想将id聚合到一行,将Product列聚合为'spread',使得值成为变量,另一个变量包含每个Product的聚合计数,以及每个产品的总和。 ID的产品组。所以请看下面的例子:

id  DirectAuto  DA_NI   Mortgage    Mortgage_NI Personal    P_NI  
1   2   30  1   50  NA  NA  
2   1   15  NA  NA  NA  NA  
3   1   15  NA  NA  NA  NA  
4   1   15  NA  NA  NA  NA  
5   1   15  NA  NA  1   110  
6   1   15  1   50  NA  NA  
9   1   15  NA  NA  NA  NA  
11  1   15  NA  NA  NA  NA  
12  1   15  NA  NA  NA  NA  
13  1   15  NA  NA  NA  NA  
14  1   15  NA  NA  NA  NA  
15  1   15  NA  NA  NA  NA  
16  1   15  NA  NA  NA  NA  
19  1   15  NA  NA  NA  NA  
20  1   15  NA  NA  NA  NA 

例如,id 1有2个Direct Auto,所以他的DA_NI是30,他有1个抵押,所以他的NI是Mortgage_NI = 50。

所以,基本上做一个'更宽'的数据表。我还在阅读和练习tidyr并重塑,但在平均时间也许有人可以提供帮助 以下是我的一些起始代码:

df[, .(tot = .N, NI = sum(NI)), by = c("id","Product")]

然后,使用一些tidyr&重塑命令我似乎无法获得我想要的最终输出。

2 个答案:

答案 0 :(得分:1)

data.table v1.9.5融化投射提供了更好的功能。使用devel版本中的dcast

require(data.table) # v1.9.5
dcast(dt, id ~ Product, fun.agg = list(sum, length), value.var="NI", fill=NA)

我认为这就是你要找的东西。您可以查看新的HTML插图 here

根据自己的喜好重命名列。

答案 1 :(得分:0)

这样做有点棘手。它可以使用tidyrdplyr完成,但它违背了Hadley Wickgam的整洁数据原则。

dat %>%
  group_by(id, Product) %>%
  summarise(NI = sum(NI), n = n()) %>%
  gather(variable, value, n, NI) %>%
  mutate(
    col_name = ifelse(variable == "n",
      as.character(Product),
      paste(Product, variable, sep = "_"))
  ) %>%
  select(-c(Product, variable)) %>%
  spread(col_name, value)