代码之家  ›  专栏  ›  技术社区  ›  DTYK

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

  •  2
  • DTYK  · 技术社区  · 8 年前

    我有一个经过处理的问卷数据的数据框架。每列以二进制形式度量一个特定的构造(1表示yes;0表示no;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(忽略NAs)总数的百分比。

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

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

    我想过用 nrow count 等,但他们没有理由不适用rm.

    我想要的结果是:

    qol1  qol2  qol3
    37.5  11.11 42.85
    

    谢谢,非常感谢!

    2 回复  |  直到 8 年前
        1
  •  2
  •   Ronak Shah    8 年前

    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
    
        2
  •  1
  •   s_baldur    8 年前

    使用 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