【问题标题】:Why group_by does not working with max(colSums) in dplyr为什么 group_by 不能在 dplyr 中使用 max(colSums)
【发布时间】:2018-12-11 23:20:37
【问题描述】:

我想知道每个国家,小学、初中和高中的最长总和(因为每年的持续时间可能不一样)。我首先 group_by 国家,并使用 colSum,但我得到的值是所有的 max(colSum),这意味着 group_bu 在这里根本不起作用。

我做了一些研究,我已经分离了“plyr”。其实,如果我尝试

df1 <- mtcars %>%
  group_by(cyl, gear) %>%
  summarise(
    newvar = sum(wt)
  )

效果很好。但是在这里我不是在一个列上发生变异,而是在许多列上发生变异,你知道我应该怎么做才能解决这个问题吗?

非常感谢。

 data1 = data.frame(country = c("A",'A',"A",'A',"B","B","B","B"),
    item = c("Age for primary school","Duration for primary school", "Duration for middle school", "duration for high school",
             "Age for primary school","Duration for primary school", "Duration for middle school", "duration for high school"), 
                     '2008' = c(6, 6, 4, 3,7,5,4,3),  
                     '2009' = c(6, 6, 4, 3,6,6,4,3), 
                     '2010' = c(7, 5, 4, 3,6,6,4,3),  
                     '2011' = c(7, 5, 4, 3,7,5,4,3)) 
  temp1 <- dplyr::filter(data1, item != 'Age for primary school') %>%
    dplyr::group_by(country) %>%
    dplyr::mutate(n_grade = max(colSums(.[,-c(1:2)], na.rm = TRUE))) 

【问题讨论】:

  • 你能显示你的预期输出吗?
  • 你试过summarise_atsummarise_all吗?

标签: r group-by dplyr tidyr


【解决方案1】:

如果您在 mutate 中使用 .,它将占用管道的左侧,即整个 data.frame/tibble,而不是各个组。您可以改用do

temp1 <- dplyr::filter(data1, item != 'Age for primary school') %>%
            dplyr::group_by(country) %>%
            dplyr::do(mutate(., n_grade = max(colSums(.[,-c(1:2)], na.rm = TRUE))))

作为旁注,这就是您可以使用data.table 的方式

library(data.table)
setDT(data1)
temp1 <- 
data1[item != 'Age for primary school'] %>% 
    .[, n_grade := max(colSums(.SD, na.rm = TRUE))
      , by = country
      , .SDcols = -(1:2)]

【讨论】:

  • 嗨瑞恩,非常感谢。但是请您解释一下为什么添加 do() 后 group_by 有效?
  • dplyr.tidyverse.org/reference/do.html 有文档。文档说do... 参数是“适用于每个组的表达式”。和“您可以使用. 来引用当前组”。这与在任何其他管道操作中使用. 的方式形成对比,后者指的是左侧的对象(而不是它的某个子集)。
猜你喜欢
  • 1970-01-01
  • 2014-07-09
  • 2019-09-04
  • 1970-01-01
  • 2015-01-11
相关资源
最近更新 更多