Итоговый столбец с условным if в r - PullRequest
0 голосов
/ 11 октября 2018

Я хочу иметь сводный столбец с этими условиями:

  • Если часть 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")

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Некоторые из условий кажутся избыточными, например, если 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

Дает тот же результат, что и код dplyr в jyjek.

0 голосов
/ 11 октября 2018

С 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
...