Добавьте новый столбец на основе изменения значений в других столбцах

#r #dataframe

Вопрос:

У меня есть следующий фрейм данных:

 DF <- data.frame(Col1=c(0,0,1),Col2=c(0,1,1),Col3=c(1,0,1))
 
Col1 Col2 Col3
1 0 0 1
2 0 1 0
3 1 1 1

Мне нужно добавить новый столбец «Switch», содержащий имя переменной, в которой значение строки изменилось в первый раз, поэтому вывод выглядит следующим образом:

Col1 Col2 Col3 Переключатель
1 0 0 1 Col3
2 0 1 0 Col2
3 1 1 1 NA

Любое руководство или помощь будут оценены по достоинству. Спасибо.

Ответ №1:

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

 tmp <- names(DF)[max.col(DF, 'first')]
tmp[rowSums(DF == 1) == ncol(DF)|rowSums(DF == 0) == ncol(DF)] <- NA
DF$Switch <- tmp
 

-выход

 > DF
  Col1 Col2 Col3 Switch
1    0    0    1   Col3
2    0    1    0   Col2
3    1    1    1   <NA>
 

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

1. Быстрый последующий вопрос — что делать, если у меня есть другие столбцы (например, идентификатор) во фрейме данных? Как я могу указать конкретный диапазон столбцов, которые я хочу использовать для сравнения? Спасибо

2. @RNewbie Просто подмножество столбцов names(DF)[1:3][max.col(DF[1:3], "first")] , т. е. Везде, где мы используем DF код, должно быть подмножество только с выбранными столбцами

3. Здравствуйте, у меня есть еще один последующий вопрос — мои данные в столбце коммутатора «Q1», «Q2», «Q3» и т. Д. Я пытаюсь отделить букву «Q» от числовых значений, используя: DF %>% отдельно(DF$tmp, c(NA, «Число»), «(? <=[С-З])(?=[0-9])» ). Я получаю следующую ошибку: «Ошибка: Необходимо извлечь столбец с единственным допустимым индексом. Индекс x var имеет размер 452, но должен быть размером 1″. Любая помощь будет признательна!!!

4. @RNewbie можете ли вы опубликовать новый вопрос

5. Я только что … спасибо тебе.

Ответ №2:

Вы можете написать функцию с diff помощью и применить ее по строкам.

 switch_col <- function(x) {
  cols[which(diff(x) != 0)[1]   1]
}
cols <- names(DF)
DF$switch_col <- apply(DF, 1, switch_col)
DF

#  Col1 Col2 Col3 switch_col
#1    0    0    1       Col3
#2    0    1    0       Col2
#3    1    1    1       <NA>
 

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

 library(dplyr)

DF %>%
  rowwise() %>%
  mutate(switch_col = switch_col(c_across())) %>%
  ungroup