【问题标题】:R dplyr summarise one column value based on index of fun(another column)R dplyr 根据 fun 的索引汇总一列值(另一列)
【发布时间】:2015-07-15 10:19:42
【问题描述】:

我有一个这样的数据框,并希望在最后显示所需的输出。相反,我在中间得到了 NA 输出。有什么方法可以使用 dplyr 做我想做的事吗?

x <- c(1234, 1234, 1234, 5678, 5678)
y <- c(95138, 30004, 90038, 01294, 15914)
z <- c('2014-01-20', '2014-10-30', '2015-04-12', '2010-2-28', '2015-01-01')
df <- data.frame(x, y, z)
df$z <- as.Date(df$z)
df %>% group_by(x) %>% summarise(y = y[max(z)])

What I get:
     x  y
1 1234 NA
2 5678 NA

Desired Output:
     x     y 
1 1234 90038
2 5678 15914

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以尝试which.max 来获取max 值的数字索引,这些值可用于子集“y”元素。使用max 只会给出z 的最大值。

    df %>%
        group_by(x) %>%
        summarise(y= y[which.max(z)])
    #     x     y
    #1 1234 90038
    #2 5678 15914
    

    【讨论】:

    • 接受这个作为答案,因为它提供了所需的输出。
    • @user3949008 如果需要整行,也可以使用slice(which.max(z)) 代替summarise
    【解决方案2】:

    dplyr 中使用filtermax

    df%>%group_by(x)%>%filter(z==max(z))
    

    【讨论】:

    • 但这也会得到 z 列,根据预期结果,这是不需要的
    • 这很有趣。我错误地认为 group_by 总是需要跟摘要。获取 z 列然后通过另一个管道操作进行选择是否更有效?或者,使用上面的 which.max?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多