【问题标题】:Calculating percentage of particular value against sum of all values when the other values are all 0s当其他值全为 0 时,计算特定值相对于所有值之和的百分比
【发布时间】:2018-08-30 09:18:15
【问题描述】:

我有一个经过处理的问卷数据数据框。每列以二进制形式衡量一个特定的构造(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))

我曾想过使用nrowcount 等,但他们没有为 na.rm 提供参数。

我想要的结果是:

qol1  qol2  qol3
37.5  11.11 42.85

谢谢,非常感谢!

【问题讨论】:

  • 试试df %&gt;% summarise_all(~sum(.==1, na.rm = T)/sum(.&lt;=1, na.rm = T))。您在分母中使用sum(., na.rm = TRUE),它只是添加1s,而您实际上需要计算1s 和0s。

标签: r dplyr


【解决方案1】:

我们可以对它们使用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 和 NAs

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

# qol1     qol2     qol3 
#37.50000 11.11111 42.85714

【讨论】:

    【解决方案2】:

    在基础 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      相关资源
      最近更新 更多