Объединение нескольких условий из нескольких столбцов в новый столбец - PullRequest
0 голосов
/ 14 октября 2018

Я не могу заставить свой код работать, когда я хочу создать новый столбец с одним целым числом из нескольких условий из нескольких столбцов.

У меня есть 4 переменные: pun1, pun2, pun3, pun4. Я хочупреобразовать эти строки в зависимости от условий в новый столбец (pun_severity_out) и присвоить ему 1, если все условия выполняются.Всякий раз, когда условие не соответствует действительности, целое число должно измениться на pun_severity_out = 0

. Дело в том, что pun1 и pun2 сгруппированы вместе, как и pun3 и pun4.

Всякий раз, когда есть NAэто означает, что этот человек был оценен другими (вы не можете наказать себя).Поскольку эти Ss сгруппированы, у нас есть ingroup и outgroup.Так что если pun1 == NA, это означает, что внешняя группа - pun3 & pun4.Для ясности, если pun3 == NA, то внешняя группа будет pun1 & pun2.

. Я хочу добиться, чтобы все значения 4 или выше для обоих членов внешней группы вбыть объединены в одно значение, 1. Но только если в другой группе присутствует NA, потому что мы специально хотим, чтобы члены внешней группы.

Редактировать: пример данных

   UniqueSS subject group       part round  treatment pun1 pun2 pun3 pun4 severity_pun_out
1        11       1     1 punishment     0 homogenous   NA    0    0    0                0
2        12       2     1 punishment     0 homogenous    0   NA    0    0                0
3        13       3     1 punishment     0 homogenous    0    0   NA    0                0
4        14       4     1 punishment     0 homogenous    0    0    1   NA                0
5        11       1     1 punishment     1 homogenous   NA    0    0    0                0
6        12       2     1 punishment     1 homogenous    0   NA    0    0                0
7        13       3     1 punishment     1 homogenous    0    0   NA    0                0
8        14       4     1 punishment     1 homogenous    0    0    0   NA                0
9        11       1     1 punishment     2 homogenous   NA    0    0    0                0
10       12       2     1 punishment     2 homogenous    0   NA    5    4                1

Моя лучшая попытка заключается в следующем, но это дает NA при использовании большего количества ifelse () внутри одного и того же оператора:

df5$severity_pun_out <- with(df5, ifelse(pun1 == NA & pun3 >= 4 & pun4 >= 4, 1, ifelse(pun2 == NA & pun3 >= 4 & pun4 >= 4, 1, ifelse(pun3 == NA & pun1 >= 4 & pun2 >= 4, 1, ifelse(pun4 == NA & pun1 >= 4 & pun2 >= 4, 1, 0 )))))

1) Если pun1 == NA, то pun3 &pun4 является внешней группой.

2) Тогда, если значения pun3 & pun4 равны или превышают 4, поместите 1 в этой строке для (нового) столбца pun_severity_out.

Я думаю, что НС вызывают некоторый шум, но это просто условие, которое должно быть выполнено.Я не уверен, как решить эту проблему, потому что я просто призываю 1 не преобразовывать какие-либо NA.

Должен ли я вызвать конкретную строку с этим конкретным NA, а затем применить преобразование внешней группы?Я предполагаю, что это то, что я делаю с ifelse (), потому что мы специально используем строку с этим конкретным NA.

Код (или функция) предпочтительно короткий, простой и общеприменимый и не взаимодействует снабор данных (за исключением возможного создания столбца pun_severity_out ).Я мог бы хотеть изменить значение отсечения на 3, поэтому изменение кода не должно быть больше, чем изменение значения.

Я не часто использую dplyr, но если это намного лучше / проще /Я буду использовать его быстрее.

Дополнительный вопрос

Бонусные баллы, если вы можете выделить ингруппу pun(X) из 4 переменных и поместить ее целое число в новый столбец с именем pun_severity_in,Например, если pun1 == NA, добавьте pun2 в строку столбца pun_severity_in.

Использованные источники

Как создать столбец на основе нескольких условий?

Как создать новый столбец на основе нескольких условий из нескольких столбцов?

https://stats.stackexchange.com/questions/115162/filtering-a-dataframe-in-r-based-on-multiple-conditions

Спасибо взаранее

1 Ответ

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

Вы не можете использовать == для тестирования NA, вы просто получите NA обратно.Вместо этого используйте is.na.Попробуйте это:

df5$severity_pun_out <-
  with(df5, ifelse(
    is.na(pun1) &
      pun3 >= 4 &
      pun4 >= 4,
    1,
    ifelse(
      is.na(pun2) &
        pun3 >= 4 &
        pun4 >= 4,
      1,
      ifelse(
        is.na(pun3) &
          pun1 >= 4 &
          pun2 >= 4,
        1,
        ifelse(is.na(pun4) &
                 pun1 >= 4 &
                 pun2 >= 4, 1, 0
        )
      )
    )
  )
)

Более простой альтернативой было бы объединить парные условия is.na с |, например:

df5$severity_pun_out <-
  with(df5, ifelse(
    (is.na(pun1) | is.na(pun2)) &
      pun3 >= 4 &
      pun4 >= 4,
    1,
    ifelse((is.na(pun3) | is.na(pun4)) &
             pun1 >= 4 &
             pun2 >= 4,
           1, 0)
  ))

В dplyr вы можете использоватьcase_when который может быть проще, чем ifelse, но это вопрос стиля.

...