【问题标题】:Add additional variables to dplyr summarize向 dplyr summarise 添加其他变量
【发布时间】:2015-11-03 15:56:22
【问题描述】:

我有一个数据框,我想按一个变量(a,在下面的示例中)进行分组,并总结不同变量的最大值(b,在下面的示例中)。此外,我想打印对应于最大观察值的第三个(c,在下面的示例中)变量的值。我的代码在某些情况下有效,但如果变量 c 对于组内的所有观察结果为 NA,则返回错误。有没有简单的方法来解决这个问题?

library(dplyr)
mydf<-data.frame(a=c(1,1,2,3,4,4),b=c("car","banana","phone","computer","ipod","phone"),c=c(7,2,3,4,9,8))
mydf
group_by(mydf,a) %>% summarise(max(c),b[which.max(c)])

mydf<-data.frame(a=c(1,1,2,3,4,4),b=c("car","banana","phone","computer","ipod","phone"),c=c(7,2,3,4,NA,NA))
mydf
group_by(mydf,a) %>% summarise(max(c),b[which.max(c)])

【问题讨论】:

  • 问题是某些组只有 NA 元素。当 c 是特定组的 NA 时,您的预期输出是什么?试试group_by(mydf,a) %&gt;% slice(which.max(c))
  • 当一个组中的所有观察值都是NA时,你希望它返回什么?
  • 我看到我要找的不一定是可能的; slice 功能提供了我所需要的。

标签: r dplyr


【解决方案1】:

这是一个使用dplyr 的选项来获取找到'c' 的max 值的行(按'a' 分组)。

 library(dplyr)
 group_by(mydf,a) %>% 
            slice(which.max(c))

或者如果需要为按“a”分组的“b”和“c”列返回“NA”,其中“b”中的所有元素都是NA,那么我们可以使用data.tanle。我们将“data.frame”转换为“data.table”(setDT(mydf)),按“a”分组,ifall“c”元素是“NA”,我们通过子集.SD返回NA使用不存在的索引 (.SD[.N+1]) 或 else 返回找到“c”的“最大值”的 Data.table 的子集 (.SD[which.max(c)])。

  library(data.table)
  setDT(mydf)[,if(all(is.na(c))) .SD[.N+1] else .SD[which.max(c)]  , by = a]
#   a        b  c
#1: 1      car  7
#2: 2    phone  3
#3: 3 computer  4
#4: 4       NA NA

【讨论】:

    【解决方案2】:

    我会使用data.table 作为:

    require(data.table)
    setDT(mydf)[order(-c), .SD[1L], keyby=a]
    

    dplyr 中,这将转化为:

    require(dplyr)
    mydf %>% arrange(-c) %>% group_by(a) %>% slice(1L)
    # slice seems to auto sort by 'a'
    

    【讨论】: