#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 общих столбцов, а затем каким-то образом взять эти столбцы, которые вы помогли мне создать, и вставить их обратно. Проблема для другого дня. Спасибо