【问题标题】:Return corresponding variable for max value in grouped dataframe R [duplicate]返回分组数据帧R中最大值的相应变量[重复]
【发布时间】:2020-03-01 06:51:15
【问题描述】:

我希望为 R 中的数据框中的每个组返回相应的最大值。搜索我只能找到 python 和 excel 的解决方案。

我似乎得到了正确的答案,但格式很奇怪:

例子:

set.seed(423)
df = data.frame(week = c(rep(1, 7), rep(2, 7), rep(3, 7)), 
                day = c(1:7, 1:7, 1:7), 
                value = runif(21))
    df
   week day      value
1     1   1 0.89368600
2     1   2 0.63863225
3     1   3 0.19254541
4     1   4 0.57557113
5     1   5 0.78458928
6     1   6 0.55080956
7     1   7 0.59388856
8     2   1 0.02040073
9     2   2 0.17663162
10    2   3 0.33647923
11    2   4 0.53304330
12    2   5 0.22939499
13    2   6 0.43232959
14    2   7 0.71889969
15    3   1 0.97318020
16    3   2 0.20320008
17    3   3 0.58991593
18    3   4 0.88450876
19    3   5 0.61154896
20    3   6 0.68123761
21    3   7 0.48162899

library('dplyr')

group_by(df, week) %>%
  summarize(max.day = .[which(value == max(value, na.rm = T)), 'day'])

   week max.day$    NA    NA
  <dbl>    <int> <int> <int>
1     1        1     7     1
2     2       NA    NA    NA
3     3       NA    NA    NA

max.day (1, 7, 1) 的值看起来是正确的,如果您将此代码中的值与原始 df 匹配就可以看出:

group_by(df, week) %>%
  summarise(value = max(value))

   week value
  <dbl> <dbl>
1     1 0.894
2     2 0.719
3     3 0.973

但我想要(以及我对代码的期望)是一个如下所示的表格:

  week max.day
1    1       1
2    2       7
3    3       1

我在这里做错了什么?

此外,如果我有一个大型数据集,其中某些组的最大值可能重复,此代码是否有效。基本上我的.[which(value == max(value, na.rm = T)), 'day'] 会按组应用,还是只是查看整个向量?

【问题讨论】:

  • setNames(do.call("rbind", lapply(split(df, df$week), function(x){x[which.max(x$value),c("week" , "day")]})), c("week", "max_day"))

标签: r dplyr time-series


【解决方案1】:

我们可以使用which.max。如果max 'value' 有关联,即每个'week' 有多个max 值,则which.max 返回第一个max 'value' 的索引,使用它来子集相应的'day '

library(dplyr)
df %>%
   group_by(week) %>% 
   summarise(max.day = day[which.max(value)])
# A tibble: 3 x 2
#   week max.day
#  <int>   <int>
#1     1       1
#2     2       7
#3     3       1

使用==,如果存在关联,则有可能匹配多个元素,而summarise 只能返回单个行/组,从而导致利益冲突并最终出错


如果打算返回行,另一个选项是 filterslice

df %>%
   group_by(week) %>%
   slice(which.max(value)) %>%
   select(week, max.day = day)

数据

df <- structure(list(week = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), day = c(1L, 2L, 
3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 
5L, 6L, 7L), value = c(0.893686, 0.63863225, 0.19254541, 0.57557113, 
0.78458928, 0.55080956, 0.59388856, 0.02040073, 0.17663162, 0.33647923, 
0.5330433, 0.22939499, 0.43232959, 0.71889969, 0.9731802, 0.20320008, 
0.58991593, 0.88450876, 0.61154896, 0.68123761, 0.48162899)), 
   class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21"))

【讨论】:

  • 那行得通。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 2022-01-09
  • 2023-03-19
  • 2015-02-16
  • 2020-04-15
  • 2021-05-31
相关资源
最近更新 更多