【问题标题】:Apply function to Dataframe based on Multi-level Grouping in R [duplicate]基于R中的多级分组将函数应用于Dataframe [重复]
【发布时间】:2021-02-05 07:35:25
【问题描述】:

我正在尝试将一个函数应用于数据框以添加一个列,该列根据气象站 ID (WSID) 和季节分组计算每条记录的百分位排名。

## temperatures data frame:

WSID    Season  Date    Temperature
20  Summer  24/01/2020  18
12  Summer  25/01/2020  20
20  Summer  26/01/2020  25
12  Summer  27/01/2020  17
20  Winter  18/10/2020  15
12  Winter  19/10/2020  12
12  Winter  20/10/2020  13
12  Winter  21/10/2020  14

## Code tried:
perc.rank <- function(x) trunc(rank(x))/length(x)

rank.perc = function(mdf) {
  combined1 = mdf %>%
  mutate(percentile = perc.rank(Temperature))
}

temperatures = temperatures %>%
  split(.$WSID) %>%
  map_dfr(~rank.perc(.))

## Expected Output :

WSID    Season  Date    Temperature Percentile
20  Summer  24/01/2020  18  0.333
12  Summer  25/01/2020  20  0.444
20  Summer  26/01/2020  25  0.666
12  Summer  27/01/2020  17  0.333
20  Winter  18/10/2020  15  
12  Winter  19/10/2020  12  
12  Winter  20/10/2020  13  
12  Winter  21/10/2020  14  


是否有一些优雅的方法可以使用诸如 group_modify、group_split、map 和/或 split 之类的函数来做到这一点? 我在想应该有,例如,如果有 3 个或更多级别的分组因子。

当我按 WSID 拆分数据时,该代码适用,但当我还想按 WSID + 季节分组时,我似乎无法获得任何进一步的信息。

(填入的百分位数值由Excel百分位等级函数计算得出)

【问题讨论】:

  • 抱歉,这是我在 Stack Overflow 上的第一篇文章,所以我只是习惯了语法。我现在已经更新了我的帖子。希望现在更清晰,更容易理解。

标签: r grouping


【解决方案1】:

你可以直接使用group_by的函数而不是拆分,函数rank.perc 似乎没有必要。

library(dplyr)

perc.rank <- function(x) trunc(rank(x))/length(x)

df %>%
  group_by(WSID) %>%
  mutate(percentile = perc.rank(Temperature))

group_by 中,稍后可以轻松添加更多分组,例如 - group_by(WSID, Season)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2013-02-17
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    相关资源
    最近更新 更多