【问题标题】:Summary column with conditional if in r如果在 r 中有条件的汇总列
【发布时间】:2018-10-11 09:20:01
【问题描述】:

我想要有以下条件的汇总列:

  • 如果第 1 部分大于第 2 部分和第 3 部分,则给出值 1
  • 如果第 2 部分大于第 1 部分和第 3 部分,则给出值 -1
  • 如果第 3 部分大于第 1 部分和第 2 部分,则给出值 0
  • 如果两个部分具有相同的较大值,则为 0
  • 如果 NA 给出值 NA

代码:

    df <- structure(list(id.Var1 = c("A", "A", "B", "A", "B", "C", "A", 
    "B", "C", "D"), id.Var2 = c("B", "C", "C", "D", "D", "D", "E", 
    "E", "E", "E"), Part1 = c(NA, 0, 0, 60, 100, 0, 20, 50, 20, 
     80), Part2 = c(NA, 60, 100, 0, 0, 100, 20, 50, 20, 0), Part3 = c(NA, 
     40, 0, 40, 0, 0, 60, 0, 60, 20)), row.names = c(37L, 73L, 74L, 
    109L, 110L, 111L, 145L, 146L, 147L, 148L), class = "data.frame")

【问题讨论】:

    标签: r if-statement conditional-statements apply


    【解决方案1】:

    tidyverse:

    df%>%
       mutate(res=case_when(
         Part1>Part2 & Part1>Part3~1,
         Part2>Part1 & Part2>Part3~-1,
         Part3>Part1 & Part3>Part2~0,
         Part3==Part2 | Part1==Part2 | Part1==Part3~0,
         is.na(Part3) | is.na(Part2) | is.na(Part1)~NA_real_
       ))
       id.Var1 id.Var2 Part1 Part2 Part3 res
    1        A       B    NA    NA    NA  NA
    2        A       C     0    60    40  -1
    3        B       C     0   100     0  -1
    4        A       D    60     0    40   1
    5        B       D   100     0     0   1
    6        C       D     0   100     0  -1
    7        A       E    20    20    60   0
    8        B       E    50    50     0   0
    9        C       E    20    20    60   0
    10       D       E    80     0    20   1
    

    【讨论】:

    • 只需写is.na(Part1) ~ NA_real_ 删除此行ifelse(res==9,NA,res)。查看手册"# All RHS values need to be of the same type. Inconsistent types will throw an error. # This applies also to NA values used in RHS: NA is logical, use # typed values like NA_real_, NA_complex, NA_character_, NA_integer_ as appropriate."
    • 哦,使用 tidyverse 很简单。谢谢jyjek。而且我刚刚知道使用〜NA_real_谢谢Jimbou
    【解决方案2】:

    有些条件似乎是多余的,例如如果 Part1 > Part2 则两者不能相等,如果 Part1 或 Part2 大于 Part3(前两个条件),则 Part3 不能大于 Part1 或 Part2(第三个条件)。所以你可以简单地做

    with(df, (Part1 > Part2 & Part1 > Part3) *  1 + 
             (Part2 > Part1 & Part2 > Part3) * -1 )
    # [1] NA -1 -1  1  1 -1  0  0  0  1
    

    给出与 jyjek 的 dplyr 代码相同的结果。

    【讨论】:

    • 是的,这也是可能的。谢谢lebatsnok
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2015-09-12
    • 2021-10-03
    • 1970-01-01
    • 2020-04-27
    相关资源
    最近更新 更多