首页 > 解决方案 > 创建一个 For 循环以在 R 中重复 mutate 和 case_when 和 is.na 语句

问题描述

我正在尝试循环以下代码。我需要这些确切的变量名称和条件。我正在尝试创建 83 个“self”变量和 83 个“home”变量。我想学习如何循环这个而不是用系列中的新内容Ctrl+F替换所有内容,然后复制和粘贴。我已经发布了前 3 个系列,但是我创建了 83 个,其中一些数字被跳过了。(对我来说)最难的部分是跳过, , , , , , 和循环内部。任何帮助是极大的赞赏!A(i)_A(i+1)_"A13_" "A15_""A18_""A36_""A42_" "A43_""A61_""A65_""A72_"

HYM <- mutate(HYM,A1_self = case_when( (HYM$A1_1 == 1 & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_3) == TRUE & is.na(HYM$A1_4) == TRUE) | (HYM$A1_1 == 1 & HYM$A1_2 == 1 & is.na(HYM$A1_3) == TRUE & is.na(HYM$A1_4) == TRUE) | (HYM$A1_1 == 1 & HYM$A1_3 == 1 & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_4) == TRUE) | (HYM$A1_1 == 1 & HYM$A1_4 == 1 & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_3) == TRUE) ~ 1, (HYM$A1_3 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_4) == TRUE) | (HYM$A1_3 == 1 & HYM$A1_4 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_2) == TRUE) | (HYM$A1_2 == 1 & HYM$A1_3 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_4) == TRUE) | (HYM$A1_2 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_3) == TRUE & is.na(HYM$A1_4) == TRUE) ~ 0, (HYM$A1_4 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_3) == TRUE) | (HYM$A1_2 == 1 & HYM$A1_4 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_3) == TRUE) ~ -77, (is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_3) == TRUE & is.na(HYM$A1_4) == TRUE) ~ -99 ))

HYM <- mutate(HYM, A1_home = case_when( (HYM$A1_2 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_3) == TRUE & is.na(HYM$A1_4) == TRUE) | (HYM$A1_1 == 1 & HYM$A1_2 == 1 & is.na(HYM$A1_3) == TRUE & is.na(HYM$A1_4) == TRUE) | (HYM$A1_2 == 1 & HYM$A1_3 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_4) == TRUE) | (HYM$A1_2 == 1 & HYM$A1_4 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_3) == TRUE) ~ 1, (HYM$A1_3 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_4) == TRUE) | (HYM$A1_1 == 1 & HYM$A1_3 == 1 & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_4) == TRUE) ~ 0, (HYM$A1_4 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_3) == TRUE) | (HYM$A1_3 == 1 & HYM$A1_4 == 1 & is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_2) == TRUE) | (HYM$A1_1 == 1 & HYM$A1_4 == 1 & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_3) == TRUE) ~ -77, (is.na(HYM$A1_1) == TRUE & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_3) == TRUE & is.na(HYM$A1_4) == TRUE) | (HYM$A1_1 == 1 & is.na(HYM$A1_2) == TRUE & is.na(HYM$A1_3) == TRUE & is.na(HYM$A1_4) == TRUE) ~ -99 ))

HYM <- mutate(HYM,A2_self = case_when( (HYM$A2_1 == 1 & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_3) == TRUE & is.na(HYM$A2_4) == TRUE) | (HYM$A2_1 == 1 & HYM$A2_2 == 1 & is.na(HYM$A2_3) == TRUE & is.na(HYM$A2_4) == TRUE) | (HYM$A2_1 == 1 & HYM$A2_3 == 1 & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_4) == TRUE) | (HYM$A2_1 == 1 & HYM$A2_4 == 1 & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_3) == TRUE) ~ 1, (HYM$A2_3 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_4) == TRUE) | (HYM$A2_3 == 1 & HYM$A2_4 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_2) == TRUE) | (HYM$A2_2 == 1 & HYM$A2_3 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_4) == TRUE) | (HYM$A2_2 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_3) == TRUE & is.na(HYM$A2_4) == TRUE) ~ 0, (HYM$A2_4 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_3) == TRUE) | (HYM$A2_2 == 1 & HYM$A2_4 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_3) == TRUE) ~ -77, (is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_3) == TRUE & is.na(HYM$A2_4) == TRUE) ~ -99 ))

HYM <- mutate(HYM, A2_home = case_when( (HYM$A2_2 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_3) == TRUE & is.na(HYM$A2_4) == TRUE) | (HYM$A2_1 == 1 & HYM$A2_2 == 1 & is.na(HYM$A2_3) == TRUE & is.na(HYM$A2_4) == TRUE) | (HYM$A2_2 == 1 & HYM$A2_3 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_4) == TRUE) | (HYM$A2_2 == 1 & HYM$A2_4 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_3) == TRUE) ~ 1, (HYM$A2_3 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_4) == TRUE) | (HYM$A2_1 == 1 & HYM$A2_3 == 1 & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_4) == TRUE) ~ 0, (HYM$A2_4 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_3) == TRUE) | (HYM$A2_3 == 1 & HYM$A2_4 == 1 & is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_2) == TRUE) | (HYM$A2_1 == 1 & HYM$A2_4 == 1 & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_3) == TRUE) ~ -77, (is.na(HYM$A2_1) == TRUE & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_3) == TRUE & is.na(HYM$A2_4) == TRUE) | (HYM$A2_1 == 1 & is.na(HYM$A2_2) == TRUE & is.na(HYM$A2_3) == TRUE & is.na(HYM$A2_4) == TRUE) ~ -99 ))

HYM <- mutate(HYM,A3_self = case_when( (HYM$A3_1 == 1 & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_3) == TRUE & is.na(HYM$A3_4) == TRUE) | (HYM$A3_1 == 1 & HYM$A3_2 == 1 & is.na(HYM$A3_3) == TRUE & is.na(HYM$A3_4) == TRUE) | (HYM$A3_1 == 1 & HYM$A3_3 == 1 & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_4) == TRUE) | (HYM$A3_1 == 1 & HYM$A3_4 == 1 & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_3) == TRUE) ~ 1, (HYM$A3_3 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_4) == TRUE) | (HYM$A3_3 == 1 & HYM$A3_4 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_2) == TRUE) | (HYM$A3_2 == 1 & HYM$A3_3 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_4) == TRUE) | (HYM$A3_2 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_3) == TRUE & is.na(HYM$A3_4) == TRUE) ~ 0, (HYM$A3_4 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_3) == TRUE) | (HYM$A3_2 == 1 & HYM$A3_4 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_3) == TRUE) ~ -77, (is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_3) == TRUE & is.na(HYM$A3_4) == TRUE) ~ -99 ))

HYM <- mutate(HYM, A3_home = case_when( (HYM$A3_2 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_3) == TRUE & is.na(HYM$A3_4) == TRUE) | (HYM$A3_1 == 1 & HYM$A3_2 == 1 & is.na(HYM$A3_3) == TRUE & is.na(HYM$A3_4) == TRUE) | (HYM$A3_2 == 1 & HYM$A3_3 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_4) == TRUE) | (HYM$A3_2 == 1 & HYM$A3_4 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_3) == TRUE) ~ 1, (HYM$A3_3 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_4) == TRUE) | (HYM$A3_1 == 1 & HYM$A3_3 == 1 & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_4) == TRUE) ~ 0, (HYM$A3_4 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_3) == TRUE) | (HYM$A3_3 == 1 & HYM$A3_4 == 1 & is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_2) == TRUE) | (HYM$A3_1 == 1 & HYM$A3_4 == 1 & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_3) == TRUE) ~ -77, (is.na(HYM$A3_1) == TRUE & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_3) == TRUE & is.na(HYM$A3_4) == TRUE) | (HYM$A3_1 == 1 & is.na(HYM$A3_2) == TRUE & is.na(HYM$A3_3) == TRUE & is.na(HYM$A3_4) == TRUE) ~ -99 ))
 ID       A1_1       A1_2     A1_3   A1_4     A2_1      A2_2    A2_3  A2_4  A3_1  A3_2
   <chr>  <dbl+>  <dbl+lbl> <dbl+lb> <dbl+> <dbl+lb> <dbl+lbl> <dbl+l> <dbl> <dbl> <dbl>
 1 1234.     NA NA           1 [No]     NA NA       NA         1 [No]    NA    NA    NA
 2 2345.     NA  1 [Yes (…  NA          NA NA       NA         1 [No]    NA    NA    NA
 3 3456.     NA  1 [Yes (…  NA          NA NA        1 [Yes … NA         NA    NA    NA
 5 4567.     NA NA           1 [No]     NA  1 [Yes… NA        NA         NA    NA    NA
 6 5678.     NA NA           1 [No]     NA NA       NA         1 [No]    NA    NA    NA
 7 9876.     NA NA           1 [No]     NA NA       NA         1 [No]    NA    NA    NA
 8 6789.     NA NA           1 [No]     NA NA       NA         1 [No]    NA    NA    NA
 9 8765.     NA NA          NA          NA NA       NA        NA         NA    NA    NA
10 1234.     NA NA 
11 1234. NA       NA       NA      NA       NA       NA       NA      NA       NA      
12 1234. NA       NA       NA      NA       NA       NA       NA      NA       NA      
13 1234.  1 [Yes…  1 [Yes… NA      NA        1 [Yes…  1 [Yes… NA      NA        1 [Yes…
14 1234. NA       NA       NA      NA       NA       NA       NA      NA       NA      
15 1234. NA       NA       NA       1 [Doe… NA       NA       NA       1 [Doe… NA      
16 1234. NA        1 [Yes… NA      NA       NA       NA        1 [No] NA       NA      
17 1234. NA       NA        1 [No] NA        1 [Yes… NA       NA      NA       NA      
18 1234. 1 [Yes… NA       NA      NA       NA       NA       NA       1 [Doe… NA      
19 1234.  1 [Yes… NA       NA      NA       NA       NA        1 [No] NA        1 [Yes…
20 1234.  1 [Yes… NA       NA      NA        1 [Yes… NA       NA      NA       NA      

标签: rfor-loopcasedplyr

解决方案


函数pivot_longer()pivot_wider()group_by()将允许您避免复制查找粘贴例程。

顺便说一句,在创建可重现的示例时,展示您如何创建数据示例会很有帮助。我不能完全按照你的数据示例,所以我创建了一个类似的数据集:

library(dplyr)
library(tidyr)

# create example data
set.seed(1)
HYM <- matrix(data = rbinom(20*10, 1, .1),
              nrow = 20,
              ncol = 10) %>%
  as.data.frame()
HYM[HYM == 0] <- NA
names(HYM) <- c(paste0("A1_", 1:4),
                paste0("A2_", 1:4),
                paste0("A3_", 1:2))
HYM$ID <- c(1234, 2345, 3456, 4567, 5678, 
            9876, 6789, 8765, rep(1234, 12))
HYM <- HYM %>% select(ID, everything())
# view first 6 rows of example data
head(HYM)
    ID A1_1 A1_2 A1_3 A1_4 A2_1 A2_2 A2_3 A2_4 A3_1 A3_2
1 1234   NA   NA   NA   NA   NA   NA   NA    1   NA   NA
2 2345   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
3 3456   NA   NA    1   NA   NA   NA   NA   NA   NA   NA
4 4567   NA   NA   NA   NA   NA   NA    1   NA   NA    1
5 5678   NA    1   NA   NA   NA   NA   NA   NA   NA   NA
6 9876   NA   NA   NA   NA   NA    1    1   NA   NA   NA

从您的代码中,您似乎希望单独考虑原始数据中的每一行(无论 ID 列如何)并根据每个变量名称的第一部分(例如,“A2_1”的“A2”部分)生成分组摘要")。

为此,我们可以添加行标识符并将数据重新整形为更长的格式。通过这个重塑步骤,我们可以将每个变量的名称(“A2_1”)分成两部分(“A2”和“1”)。这将允许我们按变量名的“A2”部分进行分组,避免复制-查找-粘贴:

HYM_long <- HYM %>%
  # add a row identifier
  mutate(row_id = row_number()) %>%
  # swing all your 'A*_*' variables into a column with their values in another column
  pivot_longer(cols = c(-ID, -row_id),
               names_to = "name",
               values_to = "condition") %>%
  # pull apart the, e.g., "A2" and "1" of "A2_1"
  separate(name, c("name1", "name2"), sep = "_") %>%
  # make names friendly to pull back out into a wider format 
  mutate(name2 = paste0("name2_", name2)) %>%    # e.g. "1" becomes "name2_1"
  pivot_wider(names_from = name2, 
              values_from = condition,
              values_fill = 0)

请注意,如果我们查看数据,在最后一步中,我们将不存在的变量填充为 0;例如,示例数据中没有“A3_3”,因此name1“A3”何时name2_3为 0:

# peek at the data
head(HYM_long)

     ID row_id name1 name2_1 name2_2 name2_3 name2_4
  <dbl>  <int> <chr>   <int>   <int>   <int>   <int>
1  1234      1 A1         NA       1      NA       1
2  1234      1 A2         NA      NA       1      NA
3  1234      1 A3         NA      NA       0       0
4  2345      2 A1         NA      NA      NA      NA
5  2345      2 A2         NA      NA      NA      NA
6  2345      2 A3         NA      NA       0       0

接下来,确定要跳过且不为self和变量赋值的home变量。对于这个例子,我假设“A3_”是这些变量之一,但我已经为你提到的确切变量包含了注释掉的代码:

# identify the variables you want to skip over
# pass_vars <- paste0("A", c(13, 15, 18, 36, 42, 43,61, 65, 72))
pass_vars <- "A3"

现在总结selfhome变量(没有复制查找粘贴):

# create self and home variables
HYM_long_subset <- HYM_long %>%
  filter(!name1 %in% pass_vars) %>%
  group_by(row_id, ID, name1) %>%
  summarize(self = case_when(
    name2_1 == 1 & sum(is.na(name2_2), is.na(name2_3), is.na(name2_4)) > 1 ~ 1,
    name2_3 == 1 & sum(is.na(name2_1), is.na(name2_2), is.na(name2_4)) > 1 ~ 0,
    name2_2 == 1 & is.na(name2_1) & is.na(name2_3) & is.na(name2_4) ~ 0,
    name2_4 == 1 & sum(is.na(name2_1), is.na(name2_2), is.na(name2_3)) > 1 ~ -77,
    is.na(name2_1) & is.na(name2_2) & is.na(name2_3) & is.na(name2_4) ~ -99),
    home = case_when(
      name2_2 == 1 & sum(is.na(name2_1), is.na(name2_3), is.na(name2_4)) > 1 ~ 1,
      name2_4 == 1 & sum(is.na(name2_2), is.na(name2_3), is.na(name2_1)) > 1 ~ -77,
      name2_3 == 1 & sum(is.na(name2_2), is.na(name2_1), is.na(name2_4)) > 1 ~ 0,
      name2_1 == 1 & sum(is.na(name2_2), is.na(name2_3), is.na(name2_4)) > 1 ~ -99,
      is.na(name2_1) & is.na(name2_2) & is.na(name2_3) & is.na(name2_4) ~ -99))

数据就在那里,但如果你想把它转回宽格式:

# swing wide & remove the row identifier
HYM_long_subset %>%
  pivot_longer(cols = c(self, home),
               names_to = "summary_type") %>%
  mutate(name_var = paste(name1, summary_type, sep = "_")) %>%
  select(row_id, ID, name_var, value) %>%
  pivot_wider(names_from = name_var,
              values_from = value) %>% 
  ungroup() %>%
  select(-row_id)

# A tibble: 20 x 5
      ID A1_self A1_home A2_self A2_home
   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
 1  1234     -77       1       0       0
 2  2345     -99     -99     -99     -99
 3  3456     -99     -99     -99     -99
 4  4567       1     -99       0       1
 5  5678     -99     -99     -99     -99
 6  9876     -99     -99     -99     -99
 7  6789       1     -99     -99     -99
 8  8765     -99     -99     -99     -99
 9  1234     -99     -99       0       1
10  1234     -99     -99     -99     -99
11  1234     -99     -99       0       1
12  1234     -99     -99     -99     -99
13  1234     -99     -99     -99     -99
14  1234     -99     -99     -99     -99
15  1234     -99     -99       0       0
16  1234     -99     -99     -99     -99
17  1234     -99     -99     -99     -99
18  1234       1     -99     -99     -99
19  1234     -99     -99       0       0
20  1234     -77     -77     -99     -99

带有 for 循环的示例

与您在原始问题中提到的数据结构(“A92_4”等)保持一致,这里是一个使用 for 循环的示例(根据评论中的要求)。

# creating a new data example
set.seed(1)
n_name1 <- 92  # e.g., "A1_" ... "A92_"
n_name2 <- 4   # e.g., "A1_1" ... "A1_4"
HYM <- matrix(data = rbinom(20*(n_name1*n_name2), 1, .1),
              nrow = 20,
              ncol = (n_name1*n_name2)) %>%
  as.data.frame()
HYM[HYM == 0] <- NA
names(HYM) <- paste0("A", 1:n_name1) %>%
  rep(., each = n_name2) %>%
  paste0(., "_", 1:n_name2)
HYM$ID <- c(1234, 2345, 3456, 4567, 5678, 
            9876, 6789, 8765, rep(1234, 12))
HYM <- HYM %>% select(ID, everything())

# identify the variables you want to skip over ... from these we can then
#   grab the starting pattern of the variables you want to keep/summarize
pass_vars <- paste0("A", c(13, 15, 18, 36, 42, 43,61, 65, 72))
keep_vars <- names(HYM %>% select(-ID, -starts_with(pass_vars)))
keep_vars.name1 <- keep_vars %>%
  gsub("_.*", "", .) %>%
  unique()

在您的情况下,在您的语句中使用symand !!(又名 bang-bang)动态命名和引用变量会很有用:mutate

# using mutate to add on summary variables
for (i in keep_vars.name1) {
  var_names <- paste0(i, "_", 1:n_name2)
  new_vars  <- paste0(i, c("_self", "_home"))
  
  HYM <- HYM %>% mutate(
    !!sym(new_vars[1]) := case_when(
      (!!sym(var_names[1]) == 1) & (sum(is.na(!!sym(var_names[2])), 
                                        is.na(!!sym(var_names[3])), 
                                        is.na(!!sym(var_names[4]))) > 1) ~ 1,
      (!!sym(var_names[3]) == 1) &  (sum(is.na(!!sym(var_names[1])), 
                                         is.na(!!sym(var_names[2])), 
                                         is.na(!!sym(var_names[4]))) > 1) ~ 0,
      (!!sym(var_names[2]) == 1) &  (sum(is.na(!!sym(var_names[1])), 
                                         is.na(!!sym(var_names[3])), 
                                         is.na(!!sym(var_names[4]))) > 1) ~ 0,
      (!!sym(var_names[4]) == 1) &  (sum(is.na(!!sym(var_names[1])), 
                                         is.na(!!sym(var_names[2])), 
                                         is.na(!!sym(var_names[3]))) > 1) ~ -77,
      is.na(!!sym(var_names[1])) & is.na(!!sym(var_names[2])) &
        is.na(!!sym(var_names[3])) & is.na(!!sym(var_names[4])) ~ -99),
    !!sym(new_vars[2]) := case_when(
      (!!sym(var_names[2]) == 1) & (sum(is.na(!!sym(var_names[1])), 
                                        is.na(!!sym(var_names[3])), 
                                        is.na(!!sym(var_names[4]))) > 1) ~ 1,
      (!!sym(var_names[4]) == 1) &  (sum(is.na(!!sym(var_names[1])), 
                                         is.na(!!sym(var_names[2])), 
                                         is.na(!!sym(var_names[3]))) > 1) ~ -77,
      (!!sym(var_names[3]) == 1) &  (sum(is.na(!!sym(var_names[1])), 
                                         is.na(!!sym(var_names[2])), 
                                         is.na(!!sym(var_names[4]))) > 1) ~ 0,
      (!!sym(var_names[1]) == 1) &  (sum(is.na(!!sym(var_names[4])), 
                                         is.na(!!sym(var_names[2])), 
                                         is.na(!!sym(var_names[3]))) > 1) ~ -99,
      is.na(!!sym(var_names[1])) & is.na(!!sym(var_names[2])) &
        is.na(!!sym(var_names[3])) & is.na(!!sym(var_names[4])) ~ -99))
}

推荐阅读