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