我问了一个非常相似的问题,因为我还没有完全掌握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&重塑命令我似乎无法获得我想要的最终输出。
答案 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)
这样做有点棘手。它可以使用tidyr
和dplyr
完成,但它违背了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)