R 计算两列的百分比

R 计算两列的百分比,r,dataframe,dplyr,percentage,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

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

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之和。我知道整列取和,但我想取每小时和每一天的和。 非常感谢您的帮助。

您只需执行以下操作:

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

您需要对天和小时使用
groupby()
,以便仅将一天中的小时分组在一起。

这里有一个使用
数据的类似选项。表
语法。将“data.frame”转换为“data.table”,按“day”、“hour”分组,在
.SDcol
中指定感兴趣的列,循环这些列(
lappy(…
),进行计算,并分配(
:=
)以创建新列

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

我们可以使用
ave
的base R选项,并按
day
hour
对它们进行分组

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))

df$t1perc这里是一个使用
ave
prop.table
的基本R选项

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

我想你的拼写错误是
t1/sum(t2)