【问题标题】:Creating a For Loop to repeat a mutate and case_when and is.na statements in R创建一个 For 循环以在 R 中重复 mutate 和 case_when 和 is.na 语句
【发布时间】:2021-10-10 21:46:55
【问题描述】:

我正在尝试循环以下代码。我需要这些确切的变量名称和条件。我正在尝试创建 83 个“self”变量和 83 个“home”变量。我想学习如何循环这个而不是Ctrl+F,并用系列中的新A(i+1)_替换所有A(i)_,然后复制和粘贴。 我已经发布了前 3 个系列,但是我创建了 83 个,其中一些数字被跳过了。最困难的部分(对我来说)是在循环中跳过"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      

【问题讨论】:

  • 请您提供示例数据以使您的问题可重现吗?
  • 我是这个网站的新手,如何上传示例数据?
  • 请输入dput(head(HYM, 30)),复制structure(...)-输出,编辑您的问题并将structure(...)放在那里。
  • 这看起来像是一种反模式,我相信有一种更简单的方法可以帮助避免手动粘贴和潜在的拼写错误。你能描述一下逻辑是什么吗?

标签: r for-loop case dplyr


【解决方案1】:

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”部分)生成分组摘要“A2_1”)。

为此,我们可以添加行标识符并将数据重新整形为更长的格式。通过这个重塑步骤,我们可以将每个变量的名称(“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

接下来,确定要跳过的变量,而不是为 selfhome 变量赋值。对于这个例子,我假设“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 循环的示例(根据 cmets 中的要求)。

# 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()

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

# 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))
}

【讨论】:

  • 不是我想要的,但这对于我想要实现的目标来说非常有用。我将尝试调整它以从三个 A1_1、A1_2、A1_3、A1_4 到 A1_92、A2_92、A3_92、A4_92 变量创建新的 self 和 home 变量。我需要它们变得明确,有 1 = 是、2 = 否和 -77 = 不适用的三个响应。由于我是初学者,因此我也有兴趣使用 For 循环进行自我启迪。
  • @JuanCabrera 我添加了一个使用 for 循环的示例。如果答案有帮助,请考虑给予支持或将其标记为答案。如果没有,我建议使用可重现的示例更新您的问题(reprex;请参阅stackoverflow.com/help/minimal-reproducible-example)。您评论中变量的命名约定(“A4_92”)似乎与您的问题不匹配,我不确定“2 = no”的编码在哪里起作用。这些是要包含在您的代表中的详细信息类型,以便您可以快速获得所需的帮助。
猜你喜欢
  • 2020-01-11
  • 1970-01-01
  • 2022-11-30
  • 2018-08-05
  • 2021-10-18
  • 1970-01-01
  • 2022-01-12
  • 2020-03-08
  • 2018-10-21
相关资源
最近更新 更多