Вычисление процента конкретного значения от суммы всех значений, когда все другие значения равны 0 - PullRequest
0 голосов
/ 29 августа 2018

У меня есть фрейм данных анкеты, который подвергся обработке. Каждый столбец измеряет конкретную конструкцию в двоичных терминах (1 представляет да; 0 представляет нет; NA - пробелы).

Пример кадра данных выглядит следующим образом:

df <- data.frame(qol1 = c(1, 0, 0, 1, NA, 0, 0, 1, NA, 0), 
             qol2 = c(0, 0, 0, 0, NA, 1, 0, 0, 0, 0),
             qol3 = c(1, 0, NA, NA, NA, 0, 0, 0, 1, 1))

df
   qol1 qol2 qol3
1     1    0    1
2     0    0    0
3     0    0   NA
4     1    0   NA
5    NA   NA   NA
6     0    1    0
7     0    0    0
8     1    0    0
9    NA    0    1
10    0    0    1

Я хотел бы рассчитать процент от 1 с от общего числа 1 и 0 (без учета NA) для каждого столбца.

Я попытался использовать следующий код, но он не привел к правильному ответу, потому что все, что добавляет 0, приведет к тому же числу:

library(dplyr)

df2 <- df %>%
  summarise_all(funs(sum(. == 1, na.rm = TRUE)/sum(., na.rm = TRUE)*100))

Я думал об использовании nrow, count и т. Д., Но у них нет аргумента для na.rm.

Я хотел бы получить желаемый результат:

qol1  qol2  qol3
37.5  11.11 42.85

Спасибо и высоко ценим!

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Использование mean() в базе R:

sapply(df, function(x) mean(x, na.rm = TRUE) * 100)

    qol1     qol2     qol3 
37.50000 11.11111 42.85714

# or more concisely:
sapply(df, mean, na.rm = TRUE) * 100

Та же логика в dplyr

summarise_all(df, mean, na.rm = TRUE) * 100
  qol1     qol2     qol3
1 37.5 11.11111 42.85714
0 голосов
/ 29 августа 2018

Мы можем использовать is.na и sum над ними для вычисления значений, не относящихся к NA

library(dplyr)
df %>%
  summarise_all(funs(sum(. == 1, na.rm = TRUE)/sum(!is.na(.))*100))

#  qol1     qol2     qol3
#1 37.5 11.11111 42.85714

Опция base R с той же логикой

colSums(df == 1, na.rm = TRUE)/colSums(!is.na(df)) * 100

# qol1     qol2     qol3 
#37.50000 11.11111 42.85714 

Или даже проще, поскольку вход содержит только 1,0 и NA s

colMeans(df, na.rm = TRUE) * 100

# qol1     qol2     qol3 
#37.50000 11.11111 42.85714
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...