【问题标题】:Applying multiple if-else conditions on different columns in R在 R 中的不同列上应用多个 if-else 条件
【发布时间】:2021-10-13 00:11:20
【问题描述】:

我有以下数据集:

Column1   Column2   Column3
      3         3         1        
      2         3         2        
      1        NA         2        
     NA         4         1        
      2        NA        NA        
     NA        NA        NA       

我想创建一个具有以下条件的新列(第 4 列):

  1. 如果第 1 列和第 2 列的值相同,则第 4 列中的值与第 1 列和第 2 列中的值相同。
  2. 如果第 1 列和第 2 列的值不同,则第 4 列中的值应为 5。
  3. 如果第 1 列或第 2 列有 NA,请从第 3 列中选择值。
  4. 如果 3 列中有 2 列具有 NA,则第 4 列中的值应该是具有非 NA 值的列的值。
  5. 如果所有列都有 NA,那么第 4 列也应该有 NA。
列 1 列 2 列 3 列 4 3 3 1 3(条件 1) 2 3 2 5(条件 2) 1 不适用 2 2(条件 3) NA 4 1 1(条件 3) 2 NA NA 2(条件 4) NA NA NA NA(条件 5)

提前感谢您回答此问题。

【问题讨论】:

    标签: r if-statement nested


    【解决方案1】:

    这个怎么样?

    df <- read.table(text = "Column1   Column2   Column3
          3         3         1        
          2         3         2        
          1        NA         2        
         NA         4         1        
          2        NA        NA        
         NA        NA        NA   ", header = T)
    
    
    df %>%
      mutate(col4 = case_when(
        is.na(Column1) & is.na(Column2) & is.na(Column3) ~ NA_real_, # Con 5
        is.na(Column1) | is.na(Column2) & !is.na(Column3) ~ as.numeric(Column3), #Con 3
        !is.na(Column1) & is.na(Column2) |is.na(Column3) ~ as.numeric(Column1), #Con4
        Column1 == Column2  ~ as.numeric(Column1), #Con 1
        TRUE ~ 5 #Con 2
      ))
    
      Column1 Column2 Column3  col4
        <int>   <int>   <int> <dbl>
    1       3       3       1     3
    2       2       3       2     5
    3       1      NA       2     2
    4      NA       4       1     1
    5       2      NA      NA     2
    6      NA      NA      NA    NA
    

    新代码

    dummy <- data.frame(
      ck6ethrace = c(2,2,3,2,2,2,NA,NA,2,NA,3,NA,1,3,NA,2,NA,2,4,2),
      cm1ethrace = c(2,2,3,1,2,2,2,1,2,2,3,2,1,3,1,2,3,2,4,2),
      cf1ethrace = c(2,2,3,2,2,2,3,1,2,2,2,2,1,3,3,2,3,2,4,2)
    )
    dummy %>%
      mutate(race = case_when(
        is.na(ck6ethrace) & is.na(cm1ethrace) & is.na(cf1ethrace) ~ NA_real_, # Con 5
        is.na(ck6ethrace) | is.na(cm1ethrace) & !is.na(cf1ethrace) ~ as.numeric(cf1ethrace), #Con 3
        !is.na(ck6ethrace) & is.na(cm1ethrace) |is.na(cf1ethrace) ~ as.numeric(ck6ethrace), #Con4
        ck6ethrace == cm1ethrace  ~ as.numeric(ck6ethrace), #Con 1
        TRUE ~ 5 #Con 2
      ))
    

    结果

       ck6ethrace cm1ethrace cf1ethrace race
    1           2          2          2    2
    2           2          2          2    2
    3           3          3          3    3
    4           2          1          2    5
    5           2          2          2    2
    6           2          2          2    2
    7          NA          2          3    3
    8          NA          1          1    1
    9           2          2          2    2
    10         NA          2          2    2
    11          3          3          2    3
    12         NA          2          2    2
    13          1          1          1    1
    14          3          3          3    3
    15         NA          1          3    3
    16          2          2          2    2
    17         NA          3          3    3
    18          2          2          2    2
    19          4          4          4    4
    20          2          2          2    2
    

    【讨论】:

    • 我试过了,但没有添加新列。此外,第 1,2 和 3 列的类型为:“dbl+lbl”。
    • @TannyaKumar 我用上面添加的代码阅读了df。你介意告诉我它是否不适用于df
    • @TannyaKumar 你在分配结果吗? df &lt;- df %&gt;% ...?
    • 所以,我数据集中的第 1 列是母亲的种族,第 2 列是父亲的种族,第 3 列是孩子自我报告的种族。总共有 4898 个值(包括 NA)。我想创建第 4 列(并将其命名为“race”),以便该列包含具有上述指定条件的值。
    • @TannyaKumar 如果您能够提供dput(head(yourdata, 20)) 的一些结果,那么我认为我可以为您的数据添加代码。或者您可以按照@Gregor Thomas 所说的那样更改列的名称。
    猜你喜欢
    • 2014-09-06
    • 2015-04-21
    • 2021-08-20
    • 2021-08-28
    • 2021-04-06
    • 1970-01-01
    • 2021-10-01
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多