如何根据 R 中其他因子列的信息创建新列?

问题描述 投票:0回答:0

我已经有一段时间尝试寻找一种有效的解决方案来根据 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 和编码方面更有经验的人可以帮助我。

r r-factor mutate
© www.soinside.com 2019 - 2024. All rights reserved.