【问题标题】:Mutate new column over a large list of tibbles在大量小标题上改变新列
【发布时间】:2021-08-16 14:27:01
【问题描述】:

因此,我使用以下代码根据过滤器将以下数据帧 (df1) 拆分为多个数据帧/小标题,以便计算出每个指标的百分位数。

df1:

name group metric value
A A distance 10569
B A distance 12939
C A distance 11532
A A psv-99 29.30
B A psv-99 30.89
C A psv-99 28.90
split <-  lapply(unique(df1$metric), function(x){
                 filter <- df1 %>% filter(group == "A" & metric == x)
})

然后,这给了我一大堆小玩意儿。我现在想为每个 tibble 改变一个新列,以计算出值列的百分位等级,我可以使用以下代码来完成:

df2 <- split[[1]] %>% mutate(percentile = percent_rank(value))

我可以为每个指标执行此操作,然后将它们 row_bind 组合在一起,但这看起来很混乱。任何人都可以提出更好的方法吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用base R

    df1 <- subset(df, group == 'A')   
    df1$percentile <- with(df1, ave(value, metric, FUN = percent_rank))
    

    【讨论】:

      【解决方案2】:
      df %>% 
        group_nest(group, metric) %>% 
        mutate(percentile = map(data, ~percent_rank(.x$value))) %>% 
        unnest(cols = c("data", "percentile"))
      

      【讨论】:

      • 这也很有效,实际上与更多组一起工作会更好。谢谢!
      【解决方案3】:

      这里不需要拆分数据。您可以使用group_by 分别对每个metric 进行计算。

      library(dplyr)
      
      df %>%
        filter(group == "A") %>%
        group_by(metric) %>%
        mutate(percentile = percent_rank(value))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 2017-12-02
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        • 2021-02-18
        相关资源
        最近更新 更多