我有一个经过处理的问卷数据的数据框。每列用二进制术语度量一个特定的构造(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))
我曾经考虑过使用nrow
,count
等,但是它们没有na.rm的参数。
我想要的结果是:
qol1 qol2 qol3
37.5 11.11 42.85
非常感谢!
答案 0 :(得分:2)
我们可以在它们上使用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
具有相同逻辑的基本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