【发布时间】: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