#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