考虑以下数据框:
x <-c(rep (c ("s1", "s2", "s3"),each=5 ))
y <- c(rep(c("a", "b", "c", "d", "e"), 3) )
z<-c(1:15)
x_name <- "dimensions"
y_name <- "aspects"
z_name<-"value"
df <- data.frame(x,y,z)
names(df) <- c(x_name,y_name, z_name)
如何为每个因子级别计算和添加新的百分比列?在这种情况下,'value'
的每个'dimension'
的{{1}}百分比,以便我有这样的内容:
举例说明:'aspects'
中的7表示percentage
中与value 1
aspects
对应的dimension
下的总值中所占的百分比(15案例)等。
我搜索了论坛,但创建百分比的答案只能跨越一列,而不是两列。我最终制作了这个专栏,首先使用s1
计算维度各方面的单独df总值。然后,我将初始aggregate
与新df
合并,并通过将值列除以总值来创建百分比列。但我觉得这很笨拙。有更简单的方法吗?
答案 0 :(得分:3)
您可以使用round
和快速data.table
方法:
library(data.table)
setDT(df)[,percentage:=round(100*value/sum(value)), dimensions][]
# dimensions aspects value percentage
# 1: s1 a 1 7
# 2: s1 b 2 13
# 3: s1 c 3 20
# 4: s1 d 4 27
# 5: s1 e 5 33
# 6: s2 a 6 15
# 7: s2 b 7 18
# 8: s2 c 8 20
# 9: s2 d 9 22
#10: s2 e 10 25
#11: s3 a 11 17
#12: s3 b 12 18
#13: s3 c 13 20
#14: s3 d 14 22
#15: s3 e 15 23
答案 1 :(得分:2)
在基础R中,您可以使用ave
进行这些分组计算:
df$percentage <- ave(df$value, df$dimensions, FUN=function(x) 100*x/sum(x))
df
# dimensions aspects value percentage
# 1 s1 a 1 6.666667
# 2 s1 b 2 13.333333
# 3 s1 c 3 20.000000
# 4 s1 d 4 26.666667
# 5 s1 e 5 33.333333
# 6 s2 a 6 15.000000
# 7 s2 b 7 17.500000
# 8 s2 c 8 20.000000
# 9 s2 d 9 22.500000
# 10 s2 e 10 25.000000
# 11 s3 a 11 16.923077
# 12 s3 b 12 18.461538
# 13 s3 c 13 20.000000
# 14 s3 d 14 21.538462
# 15 s3 e 15 23.076923
在dplyr中,您可以使用group_by
和mutate
:
library(dplyr)
df %>% group_by(dimensions) %>% mutate(percentage=100*value/sum(value))
# Source: local data frame [15 x 4]
# Groups: dimensions [3]
#
# dimensions aspects value percentage
# (fctr) (fctr) (int) (dbl)
# 1 s1 a 1 6.666667
# 2 s1 b 2 13.333333
# 3 s1 c 3 20.000000
# 4 s1 d 4 26.666667
# 5 s1 e 5 33.333333
# 6 s2 a 6 15.000000
# 7 s2 b 7 17.500000
# 8 s2 c 8 20.000000
# 9 s2 d 9 22.500000
# 10 s2 e 10 25.000000
# 11 s3 a 11 16.923077
# 12 s3 b 12 18.461538
# 13 s3 c 13 20.000000
# 14 s3 d 14 21.538462
# 15 s3 e 15 23.076923
可以通过将百分比计算包装在round
函数中并传递所需的精度来执行任何所需的舍入。