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

基于跨多个列计算非NA值创建新列[重复]

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

    我有一个广泛格式的问卷数据框架对于一些问题,回答者被要求回答给定场景是否适用于他们(是,否)如果场景适用于他们,则要求受访者提供场景示例(在某些情况下,可能有多个示例)。

    我的数据集如下所示,q1指的是一个场景,q1 a、q1b和q1c是开放字段,用于提供上述场景的示例。

    df <- data.frame(Q1 = c("Yes", "No", "Yes", "No", "Yes", "Yes", "Yes"), 
                 Q1a = c("AAA", NA, "AAA", NA, "ABC", "DDD", "EEE"),
                 Q1b = c("BBB", NA, NA, NA, "BCD", NA, "AAA"),
                 Q1c = c(NA, NA, NA, NA, "EFG", NA, "AAA"))
    

    我想创建一个新的列,这样,如果一个场景应用于响应者,它将计算给定行中,以及在3列(q1a、q1b、q1c)中响应者提供的示例数。

    到目前为止,我想到的是对非NA值的每一个置换进行硬编码:

    df$count_non_NA <- ifelse(df$Q1 == "No", 0,
                          ifelse(df$Q1 == "Yes" & !is.na(df$Q1a) & !is.na(df$Q1b) & !is.na(df$Q1c), 3,
                                 ifelse(df$Q1 == "Yes" & ((!is.na(df$Q1a) & !is.na(df$Q1b)) | 
                                          (!is.na(df$Q1b) & !is.na(df$Q1c))|
                                          (!is.na(df$Q1a) & !is.na(df$Q1c))), 2, 1)))
    

    它是有效的,但是我将在每一个场景中重复同样的事情。此外,我很好奇,如果回答者有3个以上的例子来填写,会发生什么。对排列进行硬编码会很痛苦。因此,我正在寻找一个更有效的解决我的问题的方法。

    Count non-NA values across columns

    上面的截图显示了我的代码的结果。为了说明这一点,第1行显示了该场景适用于它们,并提供了两个示例(“AAA”在Q1a列;“BBB”在Q1b列)由于q1a和q1b是非na列,count_non_na列反映2。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Onyambu    8 年前
    df$column_non_NA= rowSums(!is.na(df[-1]))
    df
       Q1  Q1a  Q1b  Q1c column_non_NA
    1 Yes  AAA  BBB <NA>             2
    2  No <NA> <NA> <NA>             0
    3 Yes  AAA <NA> <NA>             1
    4  No <NA> <NA> <NA>             0
    5 Yes  ABC  BCD  EFG             3
    6 Yes  DDD <NA> <NA>             1
    7 Yes  EEE  AAA  AAA             3
    
        2
  •  2
  •   Calum You    8 年前

    有个办法 pmap 要实现跨行应用函数的效果,请执行以下操作:

    library(tidyverse)
    df <- data.frame(
      Q1 = c("Yes", "No", "Yes", "No", "Yes", "Yes", "Yes"),
      Q1a = c("AAA", NA, "AAA", NA, "ABC", "DDD", "EEE"),
      Q1b = c("BBB", NA, NA, NA, "BCD", NA, "AAA"),
      Q1c = c(NA, NA, NA, NA, "EFG", NA, "AAA")
    )
    
    df %>%
      mutate(
        count_non_na = pmap(
          .l = list(Q1a, Q1b, Q1c),
          .f = function(...) sum(!rlang::are_na(c(...)))
        )
      )
    #>    Q1  Q1a  Q1b  Q1c count_non_na
    #> 1 Yes  AAA  BBB <NA>            2
    #> 2  No <NA> <NA> <NA>            0
    #> 3 Yes  AAA <NA> <NA>            1
    #> 4  No <NA> <NA> <NA>            0
    #> 5 Yes  ABC  BCD  EFG            3
    #> 6 Yes  DDD <NA> <NA>            1
    #> 7 Yes  EEE  AAA  AAA            3
    

    于2018-07-17由 reprex package (第0.2.0版)。