计算两列的百分比
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 选项并将它们按 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))
这是使用 ave
和 prop.table
、
的基础 R 选项
data.frame(df, sapply(df[, c("t1","t2")], function(i)
ave(i, df$day, df$hour, FUN = prop.table)))
我想计算数据框的百分比,例如
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 选项并将它们按 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))
这是使用 ave
和 prop.table
、
data.frame(df, sapply(df[, c("t1","t2")], function(i)
ave(i, df$day, df$hour, FUN = prop.table)))