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

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

Дело в том, что каламбур 1 и каламбур сгруппированы вместе, как и каламбур 3 и каламбур.

Когда есть АН, это означает, что этого человека оценили другие (вы не можете наказать себя). Поскольку эти S сгруппированы, у нас есть внутренняя и внешняя группа. Итак, если 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

Моя лучшая попытка - это, но это дает НА при использовании большего количества 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, а затем применить преобразование внешней группы? Я предполагаю, что это то, что я делаю с 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

Заранее благодарим

0
fleems 14 Окт 2018 в 16:13

1 ответ

Лучший ответ

Вы не можете использовать == для тестирования 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, но это вопрос стиля.

1
Gregor Thomas 14 Окт 2018 в 15:13