R Tidyverse Определяет, какое значение столбца не совпадает, возвращает два значения

#r #tidyverse

#r #tidyverse

Вопрос:

Допустим, у меня есть эти данные:

 df<-data.frame("Row_id"=c(1,2,3,4,5,6,7,8),"A"=c(1,0,1,0,1,0,0,1),"B"=c(0,1,1,0,0,0,0,1),"C"=c(1,0,0,0,0,0,0,1),"D"=c(0,0,0,0,0,0,0,1),"E"=c(0,0,0,0,0,0,0,1),"F"=c(0,0,0,0,0,0,0,1))
  

И, как вы можете видеть, в большинстве строк все значения одинаковы. Но допустим, я хочу создать новую переменную (или две на самом деле), которая говорит мне:

  • Все ли в этой строке одинаково для переменных от A до F
  • Какие из них были «1», если не совпадают

Так, например, в приведенных выше данных я бы получил новые столбцы, которые выглядели так: введите описание изображения здесь

Помечено как tidyverse, потому что, я думаю, я бы предпочел это, но гибкий.

Ответ №1:

Мы можем использовать rowSums столбцы, кроме первого столбца, для создания логического вектора путем сравнения со вторым столбцом. Если сумма по строке равна ‘n1’, затем преобразуйте ее в числовой индекс, добавив 1, и используйте это, чтобы изменить значения на ‘Нет’, ‘Да’. Затем мы создаем «Другой» столбец, перебирая строки, paste names элементы, которые не равны 0 (здесь мы также могли бы использовать ifelse на основе «Того же» столбца

 n1 <- ncol(df[-1])
df$Same <- c("No", "Yes")[(rowSums(df[-1]  == df[,2]) == n1)   1]
df$Different <-  apply(df[2:7], 1, function(x)
        if(!all(x == 1)) toString(names(x)[x !=0 ]) else "")
  

Комментарии:

1. Спасибо! Это работает отлично! Последующий вопрос: допустим, вместо «0» указано «непроверено» и «проверено» вместо «1». Достаточно ли это просто, чтобы сделать то же самое? Если нет, я могу легко внести это изменение в первую очередь. Еще раз спасибо

2. @JoeCrozier если вы хотите сделать обратное, измените значение !=0 на !=1 и !all(x == 0)

3. @JoeCrozier Если ваш вопрос заключается в том, чтобы изменить «Нет», «Да» на «непроверенный», проверено. просто замените c("No", "Yes") на c("unchecked", "checked")

4. Ах, спасибо. Я думаю, то, что я говорил, было бы примерно так: df $Different <- apply(df[2:7], 1, function(x) if(!все(x == «Проверено»)) toString(имена (x)[x !=»Непроверено»])иначе «»). Исходная программа выдает необработанные данные из типов в этих словах

5. Это сработало, я только что проверил это. Еще раз спасибо! Теперь мне просто нужно решить другую задачу: выбрать столбцы, которые я хочу сравнить, из 400 общих столбцов, а затем каким-то образом взять эти столбцы, которые вы помогли мне создать, и вставить их обратно. Проблема для другого дня. Спасибо