【问题标题】:dplyr pivot tabledplyr 数据透视表
【发布时间】:2015-06-25 13:27:00
【问题描述】:

我想获得一个具有递减值的数据透视表。

library(dplyr)
library(tidyr)

h<-mtcars %>%
  group_by(cyl, gear) %>%
  tally() %>%
  spread(gear, n, fill = 0)
h<-h%>% add_rownames("index")

i<-mtcars %>%
  group_by(cyl, gear) %>%
  tally() %>%
  spread(cyl, n, fill = 0)

获取值的总和

j<-i%>%
  select(-1)%>%
  summarise_each(funs(sum))

k<-t(j)
k<- as.data.frame(k)
k<-tbl_df(k)
k<-k%>%add_rownames("index")

l<-left_join(h,k,by="index")
l<-l%>%
  select(-1)%>%
  arrange(desc(V1))

在 dplyr 中还有其他方法可以做到这一点吗?

【问题讨论】:

  • 谢谢akrun,你的回答简直完美

标签: r pivot dplyr tidyr


【解决方案1】:

我们按 'cyl'、'gear' 分组,获取频率计数 (tally()),从 'long' 重塑为 'wide'(使用 tidyr 中的 spread),ungroup 删除属性(以前,它曾经在没有这个的情况下工作),使用mutate 创建'V1'作为每行的sum(使用rowSums),最后arrangeorder)基于值的行在“V1”中。

library(dplyr)
library(tidyr)

mtcars %>%
   group_by(cyl, gear) %>% 
   tally() %>%
   spread(gear, n, fill=0) %>% 
   ungroup() %>%
   mutate(V1= rowSums(.[-1])) %>% 
   arrange(desc(V1))
#    cyl     3     4     5    V1
#  <dbl> <dbl> <dbl> <dbl> <dbl>
#1     8    12     0     2    14
#2     4     1     8     2    11
#3     6     2     4     1     7

【讨论】:

  • 在尝试此操作(dplyr 0.4.3、tidyr 0.4.1)时出现错误“错误:大小不兼容 (3),期望 1(组大小)或 1”。我可以通过在 spread 和 mutate 参数之间插入data.frame() %&gt;% 来解决这个问题(或者在继续之前删除属性变量(attr(h, which = "vars") &lt;- NULL)。
  • @JWilliman 您需要在传播和变异之间添加ungroup。我认为这是 2015 年至 2016 年间对功能进行一些修改的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2023-04-11
相关资源
最近更新 更多