计算两列的百分比

Calculate percentage of a two columns

我想计算数据框的百分比,例如

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 之和 places.I 知道要对整列求和,但我想对每个小时和每一天求和。 感谢任何帮助。

你可以简单地做:

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

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

这是一个使用 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]

我们可以使用 ave 的基本 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))

这是使用 aveprop.table

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