Как правильно использовать case_when при перекодировании значений в столбцах при условии? - PullRequest
0 голосов
/ 18 января 2020

У меня есть фрейм данных с 2 переменными:

Correct FACE.RESP
1       1         1
2       2         1
3       1         2
4       2         2
5       2         2
6       2         1

Я хотел бы перекодировать / заменить значения в столбце «FACE.RESP» при условии, что если значение в «FACE.RESP» 'соответствует значению в' Correct ', значение в' FACE.RESP 'должно быть переписано в 1. Если значение в' FACE.RESP 'не совпадает со значением в' Correct ', значение в' FACE.RESP 'должно быть перекодировано в 0.

Я попробовал следующий код, используя mutate и case_when:

mutate(FACE.RESP = case_when(FACE.RESP == Correct ~ '1', FACE.RESP <= Correct ~ '0', FACE.RESP >= Correct ~ '1'))

, но результаты таковы:

Correct FACE.RESP
5        2         2
6        2         1
7        1        NA
8        2        NA
9        2        NA
10       1        NA

Может кто-нибудь предложить как добиться требуемого результата и объяснить, что не так с приведенной выше строкой кода?

Ответы [ 3 ]

2 голосов
/ 18 января 2020

Мы можем использовать as.integer

df$FACE.RESP <- as.integer(df$Correct == df$FACE.RESP)

данные

df <- structure(list(Correct = c(1L, 2L, 1L, 2L, 2L, 2L), FACE.RESP = c(1L, 
1L, 2L, 2L, 2L, 1L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
2 голосов
/ 18 января 2020

Необходимо проверить только одно условие, что значения FACE.RESP и Correct одинаковы, и присвоить всем другим значениям значение 0.

library(dplyr)
df %>% mutate(FACE.RESP = case_when(FACE.RESP == Correct ~ 1,TRUE ~ 0))

#  Correct FACE.RESP
#1       1         1
#2       2         0
#3       1         0
#4       2         1
#5       2         1
#6       2         0

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

df$FACE.RESP <- +(df$Correct == df$FACE.RESP)

data

df <- structure(list(Correct = c(1L, 2L, 1L, 2L, 2L, 2L), FACE.RESP = c(1L, 
1L, 2L, 2L, 2L, 1L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
1 голос
/ 18 января 2020

Вот еще одно dplyr решение.

library(dplyr)

df %>% mutate(FACE.RESP = +(Correct == FACE.RESP))
#  Correct FACE.RESP
#1       1         1
#2       2         0
#3       1         0
#4       2         1
#5       2         1
#6       2         0
...