重塑和聚合数据表

reshape and aggregate datatable

我问了一个非常相似的问题,因为我还不太了解 tidyr 或 reshape 我不得不问另一个问题。我有一个包含重复 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' 以便值成为变量,另一个变量包含每个产品按 id 的聚合计数,以及要求和的 NI每个产品组的 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辆Mortgage,所以他的NI是Mortgage_NI = 50。

所以,基本上是制作一个 'wider' 数据表。我仍在阅读和练习 tidyr 和 reshape,但与此同时也许有人可以提供帮助。
这是我的一些起始代码:

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

之后,使用一些 tidyr 和 reshape 命令我似乎无法获得我想要的最终输出。

做这个有点棘手。它可以使用 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)

data.table v1.9.5 有更好的 熔化 铸造 功能。使用开发版本的 dcast

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

我想这就是您要找的。您可以查看 新 HTML 插图 here.

根据您的喜好重命名列。