返回分组数据帧R中最大值的对应变量 数据

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

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

示例:

set.seed(423)
df = data.frame(week = c(rep(1,7),rep(2,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

最大天数(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,'day']是按组应用的,还是仅查看整个矢量?

mgdbrrr 回答:返回分组数据帧R中最大值的对应变量 数据

我们可以使用which.max。如果有max个“值”的联系,即每个“周”有多个max个值,则which.max返回第一个max个“值”的索引,用它来子集相应的“天”

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,2L,3L,3L),day = c(1L,4L,5L,6L,7L,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"))
本文链接:https://www.f2er.com/3163280.html

大家都在问