计算两列的百分比

时间:2017-01-20 06:53:55

标签: r dataframe dplyr percentage

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

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之和。我知道要对整列进行求和,但我想要计算每小时和每天的总和。 任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:3)

你可以这样做:

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

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

答案 1 :(得分:2)

我们可以使用Intent danielIntent = new Intent(Broadcast.this, Broadcasting.class); danielIntent.putExtra("keyvalue","Free Loop"); startActivity(danielIntent); 的基本R选项,并按aveday

分组
hour

答案 2 :(得分:2)

以下是使用aveprop.table

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

答案 3 :(得分:1)

以下是使用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]