我已经有一段时间尝试寻找一种有效的解决方案来根据 R 中其他因子列的信息创建新列。我想出了一种可行的解决方案,但相当乏味,而且还很遥远。不那么乏味,但只能部分起作用。我通常使用包含 NA 的调查数据,这是问题的重要组成部分。如果我在提出这个问题时做错了什么,请原谅我,因为这既是我在 SO 的第一篇文章,也是我的第一篇 Reprex。这个问题与 SO 中提出的其他问题类似,但我无法调整任何现有的解决方案来解决我的问题。
我想要获得的是我的 tibble 中的一个新列,如果用于生成新列的所有列都是 NA,则仅返回 NA,而如果至少一列具有有效值,则返回有效值。
这是一个代表来说明我的问题:
library(tidyverse)
# create the table
df <- tibble(
othervar_2007 = c(NA, "yes", "no", "no", "no"),
morv1_2007 = c(NA, "yes", "no", "no", NA),
morv2_2007 = c(NA, "yes", NA, "no", "no"),
morv3_2007 = c(NA, "no", "yes", "no", "no"),
morv4_2007 = c(NA, "no", "no", "no", "no"),
morv_othervar = c(NA, "yes", "no", "no", "no")
)
# show table
df
#> # A tibble: 5 × 6
#> othervar_2007 morv1_2007 morv2_2007 morv3_2007 morv4_2007 morv_othervar
#> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 <NA> <NA> <NA> <NA> <NA> <NA>
#> 2 yes yes yes no no yes
#> 3 no no <NA> yes no no
#> 4 no no no no no no
#> 5 no <NA> no no no no
# alternative 1
df <- df %>%
mutate(newvar1 = case_when(
morv1_2007 == "yes" | morv2_2007 == "yes" | morv3_2007 == "yes" | morv4_2007 == "yes" ~ "Yes",
morv1_2007 == "no" | morv2_2007 == "no" | morv3_2007 == "no" | morv4_2007 == "no" ~ "No")
)
df %>%
count(newvar1)
#> # A tibble: 3 × 2
#> newvar1 n
#> <chr> <int>
#> 1 No 2
#> 2 Yes 2
#> 3 <NA> 1
# alternative 2
df <- df %>%
rowwise %>%
mutate(newvar2 = if_else(rowSums(across(c(morv1_2007, morv2_2007, morv3_2007, morv4_2007), ~ .x == "yes"))>0, "Yes", "No"))
df %>%
count(newvar2)
#> # A tibble: 3 × 2
#> # Rowwise:
#> newvar2 n
#> <chr> <int>
#> 1 No 1
#> 2 Yes 1
#> 3 <NA> 3
Created on 2023-11-09 with reprex v2.0.2
tibble 包含四列,应用于改变新列,以及两个模拟列,应按原样保留。这些列的命名也是为了说明相关列的选择问题。
标记为替代方案 1 的解决方案可行,但当您要从中获取信息的列数变大时,该解决方案非常乏味。我也无法找到选择列的良好解决方案,例如通过使用starts_with和ends_with。
但是,如果至少一列为 NA,则标记为替代方案 2 的解决方案将返回 NA。当添加 na.rm = TRUE 时,它对于仅包含 NA 的行返回“No”。选择问题也适用于此。
希望在 R 和编码方面更有经验的人可以帮助我。