【问题标题】:Create new column based on counting non-NA values across multiple columns [duplicate]基于计算多列中的非 NA 值创建新列 [重复]
【发布时间】:2018-07-18 14:33:39
【问题描述】:

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

我的数据集如下所示,Q1 指的是一个场景,而 Q1a、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 个要填写的示例,会发生什么。对排列进行硬编码会很痛苦。因此,我正在为我的问题寻求更有效的解决方案。

上面的截图显示了我的代码的结果。为了说明,第 1 行显示该场景适用于他们,并提供了两个示例(Q1a 列中的“AAA”;Q1b 列中的“BBB”)。由于 Q1a 和 Q1b 是非 NA 列,因此 count_non_NA 列反映了 2。

【问题讨论】:

  • df$column_non_NA= rowSums(!is.na(df[-1]))

标签: r if-statement


【解决方案1】:
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】:

    这里用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
    

    reprex package (v0.2.0) 于 2018 年 7 月 17 日创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 2017-11-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      相关资源
      最近更新 更多