рассчитать процент от общего количества для нескольких столбцов - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть фрейм данных в 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

Однако, поскольку я ожидаю, что исходный набор данных будет расти, это в конечном итоге станет неоптимальным для нескольких переменных

Есть ли простой способ рассчитать эти процентные вклады в одной строке кода, возвращая эти проценты в виде столбцов в существующем фрейме данных?Может быть, с Саппи или функцией?Я сделал несколько грубых попыток, но они не сработали

Желание вывода в качестве кадра данных:

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

Любая помощь будет признательна в этом

С уважением, Том

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Мы можем использовать 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
0 голосов
/ 14 декабря 2018

С 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
...