基于对多个列中的非NA值进行计数来创建新列

时间:2018-07-18 06:12:49

标签: r if-statement

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

我的数据集如下所示,其中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个以上的示例以供填写,那么很难对排列进行硬编码。因此,我正在寻求一种更有效的解决方案。

Count non-NA values across columns

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

2 个答案:

答案 0 :(得分: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-07-17创建。

答案 1 :(得分: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