Сравнение столбцов и замена значений в R

#r #if-statement #replace #multiple-columns

#r #оператор if #заменить #несколько столбцов

Вопрос:

Я пытаюсь сравнить разные столбцы («Test1» — «Test3») с одним базовым столбцом («Критерии») и заменить значения в зависимости от результата сравнения.

Вот пример — рассмотрим следующие данные:

 Test.data <- data.frame(c("Yes", "Yes", "No", "Yes"))
Test.data$Test1 <- (c("No", "No", "Yes", "Yes"))
Test.data$Test2 <- (c("Yes", "No", "Yes", "No"))
Test.data$Test3 <- (c("Yes", "Yes", "Yes", "Yes"))
colnames(Test.data) <- c("Criteria", "Test1", "Test2", "Test3")


  Criteria Test1 Test2 Test3
1      Yes    No   Yes   Yes
2      Yes    No    No   Yes
3       No   Yes   Yes   Yes
4      Yes   Yes    No   Yes
 

Есть ли эффективный способ заменить значения в «Test1» — «Test3» на 0, если значение в определенном столбце соответствует базовому столбцу, и на 1, если это не так? Может быть, с помощью if-функции?

Результат должен выглядеть следующим образом:

   Criteria Test1 Test2 Test3
1      Yes    1      0     0
2      Yes    1      1     0
3       No    1      1     1
4      Yes    0      1     0
 

Спасибо всем, что нашли время! Вы, ребята, отлично справляетесь!

Ответ №1:

Вы можете использовать :

 Test.data[-1] <-  (Test.data$Criteria != Test.data[-1])
Test.data

#  Criteria Test1 Test2 Test3
#1      Yes     1     0     0
#2      Yes     1     1     0
#3       No     1     1     1
#4      Yes     0     1     0
 

[-1] это игнорировать Criteria столбец, поскольку мы не хотим его изменять. Мы сравниваем все столбцы с Criteria column и присваиваем 1, если они разные, и 0 в противном случае. используется для изменения логических значений ( TRUE / FALSE ) на целочисленные значения ( 1 / 0 ).

Ответ №2:

Подход dplyr :

 library(dplyr)

Test.data %>% mutate(across(-Criteria, ~as.numeric(. != Criteria)))