Нужна помощь в расчете процентов каждой категориальной переменной в столбце - PullRequest
1 голос
/ 10 ноября 2019

У меня есть фрейм данных с 16 столбцами, в которых есть категории «да», «нет» и «нейтральный». В конце я хочу рассчитать процент Да, Нет и Нейтральный. Пример фрейма данных:

a = c('yes', 'yes', 'no', 'neutral', 'no', 'yes','no','neutral','neutral')
b = c('no', 'yes','no', 'no', 'no', 'neutral', 'yes', 'neutral','neutral')
abcd = data.frame(a,b)

Есть ли способ добиться этого в r?

Ответы [ 2 ]

2 голосов
/ 10 ноября 2019

Если вы хотите посчитать процент для всего фрейма данных в целом, мы можем unlist данные, рассчитать их количество, используя table и преобразовать его в процент.

table(unlist(abcd))/(nrow(abcd) * ncol(abcd)) * 100

# neutral     no     yes 
# 33.333  38.889  27.778 

Если вы хотите сделать это для каждого столбца отдельно, мы можем использовать sapply

sapply(abcd, table)/nrow(abcd) * 100

#             a      b
#neutral 33.333 33.333
#no      33.333 44.444
#yes     33.333 22.222

РЕДАКТИРОВАТЬ

Если отсутствуют некоторые уровни, мыможно сначала преобразовать его в factor, а затем использовать table

sapply(abcd, function(x) 
     table(factor(x, levels = c("Yes", "No", "Neutral"))))/nrow(abcd) * 100
0 голосов
/ 10 ноября 2019

Решение Base R:

# For each combination: 

res <- data.frame(round(prop.table(table(abcd)) * 100, 2))

# For each var separately: 

res$total_a_cat <- ave(res$Freq, res$a, FUN = sum)

res$total_b_cat <- ave(res$Freq, res$b, FUN = sum)

Данные:

abcd <-
      structure(list(
        a = structure(
          c(3L, 3L, 2L, 1L, 2L, 3L, 2L, 1L,
            1L),
          .Label = c("neutral", "no", "yes"),
          class = "factor"
        ),
        b = structure(
          c(2L,
            3L, 2L, 2L, 2L, 1L, 3L, 1L, 1L),
          .Label = c("neutral", "no",
                     "yes"),
          class = "factor"
        )
      ),
      class = "data.frame",
      row.names = c(NA,-9L))
...