【发布时间】: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