【问题标题】:Calculate percentage of a two columns [duplicate]计算两列的百分比[重复]
【发布时间】:2017-01-20 06:53:54
【问题描述】:

我想计算一个数据框的百分比,就像

day  hour  place  t1   t2
___  ____  _____  __  ___
 1    0      1     5   10
 1    0      2     6   12
 1    0      3     9   8
 1    1      1     6   12    
 1    1      2     8   15  
 1    1      3     10  18 
 1    2      1     5   1
 1    2      2     6   12
 1    2      3     9   1
 1    3      1     8   10
 1    3      2     8   2
 1    3      3     9   8
 2    0      1     5   1
 2    0      2     6   12
 2    0      3     9   8
 2    1      1     9   10
 2    1      2     6   12
 2    1      3     9   8
 2    2      1     5   10
 2    2      2     6   12
 2    2      3     9   18
 2    3      1     5   0
 2    3      2     6   2
 2    3      3     9   18

我想计算更多的两列,例如我想要按小时计算 t1 和 t2 的百分比

day  hour  place  t1   t2    t1%     t2%
___  ____  _____  __  ___    ___     ___
 1    0      1     5   10    (5/20)  (10/30)
 1    0      2     6   12    (6/20)  (12/30)
 1    0      3     9   18    (9/20)  (18/30)
 1    1      1     6   12    (12/24) (12/45)
 1    1      2     8   15    (15/24) (15/45)
 1    1      3     10  18    (18/24) (18/45)

这意味着 t1 除以每个地方的日期和小时的 t1 总和。我知道要为整个列取总和,但我想为每一小时和每一天取总和。 任何帮助表示赞赏。

【问题讨论】:

    标签: r dataframe dplyr percentage


    【解决方案1】:

    你可以这样做:

    library(tidyverse)
    df%>%
      group_by(day,hour)%>%
      mutate("t1%"=t1/sum(t1),"t2%"=t2/sum(t2))
    

    您需要使用group_by() 表示天数和小时数,以便仅将一天中的几个小时组合在一起。

    【讨论】:

    • 我认为您的 t1/sum(t2) 有错字
    【解决方案2】:

    我们可以使用ave 的base R 选项并将它们按dayhour 分组

    df$t1perc <- ave(df$t1, df$day, df$hour, FUN = function(x) x/sum(x))
    df$t2perc <- ave(df$t2, df$day, df$hour, FUN = function(x) x/sum(x))
    

    【讨论】:

      【解决方案3】:

      这是使用aveprop.table 的基本R 选项,

      data.frame(df, sapply(df[, c("t1","t2")], function(i)
                                                ave(i, df$day, df$hour, FUN = prop.table)))
      

      【讨论】:

        【解决方案4】:

        这是使用data.table 语法的类似选项。将 'data.frame' 转换为 'data.table',按 'day'、'hour' 分组,在.SDcol 中指定感兴趣的列,循环遍历那些 (lapply(..),进行计算,然后分配 ( :=) 创建新列

        library(data.table)
        setDT(df)[, paste0(names(df)[4:5], "_perc") := 
            lapply(.SD, function(x) x/sum(x)), .(day, hour), .SDcols = t1:t2]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-05
          • 2012-09-05
          • 1970-01-01
          • 2016-07-19
          • 1970-01-01
          • 1970-01-01
          • 2022-12-05
          相关资源
          最近更新 更多