我在R中有一个数据框,其中有几列构成总计列,如下所示:
data <- data_frame(
Date = c("14/12/2018", "15/12/2018", "16/12/2018"),
Ent = c("C1", "C1", "C1"),
Ans = c(4, 9, 12),
Aban = c(1, 2, 1),
OOH = c(7, 5, 6),
Total = c(12, 16, 19),
)
以下输出:
Date Ent Ans Aban OOH Total
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
14/12/2018 C1 4 1 7 12
15/12/2018 C1 9 2 5 16
16/12/2018 C1 12 1 6 19
我想做的是找到最有效的方法,我可以计算每一列占总数的百分比。下面是我当前的解决方案,它需要三行代码:
#Ans
data$AnsP <- (data$Ans / data$Total) * 100
#Aban
data$AbanP <- (data$Aban / data$Total) * 100
#OOH
data$OOHP <- (data$OOH / data$Total) * 100
但是,正如我预期的那样,源数据集将不断增长,最终对于多个变量而言,它将变得次优
是否有一种简单的方法可以在一行代码中计算这些百分比贡献,并将这些百分比作为现有数据帧中的列返回?也许是sapply或功能?我做了一些粗略的尝试,但没有成功
将期望输出作为数据框:
Date Ent Ans Aban OOH Total AnsP AbanP OOHP
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
14/12/2018 C1 4 1 7 12 33.3 8.33 58.3
15/12/2018 C1 9 2 5 16 56.2 12.5 31.2
16/12/2018 C1 12 1 6 19 63.2 5.26 31.6
对此,我们将提供任何帮助
关于, 汤姆
答案 0 :(得分:3)
使用dplyr
library(dplyr)
data %>%
mutate_at(vars(Ans:OOH) , funs(P = ./data$Total * 100))
# Date Ent Ans Aban OOH Total Ans_P Aban_P OOH_P
# <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 14/12/2018 C1 4 1 7 12 33.3 8.33 58.3
#2 15/12/2018 C1 9 2 5 16 56.2 12.5 31.2
#3 16/12/2018 C1 12 1 6 19 63.2 5.26 31.6
或者,如果您更喜欢基数R
cols <- 3:5
cbind(data, data[cols]/data$Total * 100)
由于Total
列与cols
列的总和相同,我们也可以这样做
data[cols]/rowSums(data[cols]) * 100
答案 1 :(得分:2)
我们可以使用data.table
进行分配
library(data.table)
setDT(data)[, paste0(names(data)[3:5], '_P') := lapply(.SD, function(x)
x/Total * 100), .SDcols = 3:5]
data
# Date Ent Ans Aban OOH Total Ans_P Aban_P OOH_P
#1: 14/12/2018 C1 4 1 7 12 33.33333 8.333333 58.33333
#2: 15/12/2018 C1 9 2 5 16 56.25000 12.500000 31.25000
#3: 16/12/2018 C1 12 1 6 19 63.15789 5.263158 31.57895