当其他值均为0时,计算特定值相对于所有值之和的百分比

时间:2018-08-29 09:23:22

标签: r dplyr

我有一个经过处理的问卷数据的数据框。每列用二进制术语度量一个特定的构造(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

我想计算每一列中1s与1s和0s总数(忽略NA)的百分比。

我尝试使用以下代码,但未得到正确的答案,因为任何加0的结果都将是相同的数字:

library(dplyr)

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

我曾经考虑过使用nrowcount等,但是它们没有na.rm的参数。

我想要的结果是:

qol1  qol2  qol3
37.5  11.11 42.85

非常感谢!

2 个答案:

答案 0 :(得分:2)

我们可以在它们上使用is.nasum来计算非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

具有相同逻辑的基本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

答案 1 :(得分:1)

在底数R中使用mean()

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