R 重塑和聚合数据表

R 重塑和聚合数据表,r,data.table,aggregate,reshape,tidyr,R,Data.table,Aggregate,Reshape,Tidyr,我问了一个非常类似的问题,因为我还没有完全掌握tidyr或重塑,我不得不问另一个问题。我有一个包含重复id值的数据表(见下文): 我希望将id聚合到一行,将产品列“排列”,以便值成为变量,另一个变量包含每个产品的聚合计数(按id),并将每个产品组的NI按id求和。因此,请参见下面的示例: id Product NI 1 Direct Auto 15 2 Direct Auto 15 3 Direct Auto 15 4 Direct Auto 15 5

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

我希望将id聚合到一行,将产品列“排列”,以便值成为变量,另一个变量包含每个产品的聚合计数(按id),并将每个产品组的NI按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  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,所以他的Dau NI为30,他有1个抵押,所以他的NI为抵押=50

因此,基本上是制作一个“更宽”的数据表。我仍在阅读和练习tidyr和重塑,但与此同时,也许有人能帮上忙。
以下是我的一些起始代码:

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

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

这样做有点棘手。它可以使用
tidyr
dplyr
来完成,尽管这违背了哈德利·威克格姆的整洁数据原则

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)
具有更好的熔化和铸造功能。使用devel版本中的
dcast

require(data.table) # v1.9.5
dcast(dt, id ~ Product, fun.agg = list(sum, length), value.var="NI", fill=NA)
我想这就是你要找的。您可以签出新的HTML片段


根据您的喜好重命名列。

尝试格式化您的代码供参考,最后一行代码中的语法仅适用于data.table包,它有自己的标记。如果您包含代码来创建示例数据,这样人们就可以尝试解决方案,而不必为该部分操劳。是的,我正在使用datatableulfelder…我刚刚在Excel中编写了示例数据并将其复制到中。请让我知道什么是首选方法。t首选方法使用R的
dput
命令。在开始之前,您必须将数据从excel移动到R中,所以您最好先这样做。下面是关于
dput
和一般性地问R问题的指南:我得到这个错误消息:n()中的错误:不应该直接调用这个函数。另外,我认为第一个(NI)应该是sum,不是吗?我怀疑您同时加载了
plyr
dplyr
。尝试先将
summary
替换为
dplyr::summary
或执行
detach(“package:plyr”)
。是的,它应该是
sum
。我误读了您想要的内容。我按照步骤下载了eval版本,但收到了以下错误:FUN中的错误(X[[7L]],…):找不到函数“.FUN”…此外,这会给我NI的总和和ID的乘积计数吗,我正试图在您运行的代码中可视化此问题
重塑2::dcast
,然而这需要
数据.table::dcast
。这太棒了。更不用说写文章来完成我的结果了……感谢添加的多个value.r和value.var功能。