#r #r-factor
#r #r-фактор
Вопрос:
Я пытаюсь создать новый столбец (фактор), который содержит имя столбца с наибольшим значением в фрейме данных. Думайте об этом как о доле типа почвы для каждого полигона (строк) в наборе данных. Я хочу создать новый столбец, содержащий только имя почвы с наибольшей долей. Пример:
soil <- data.frame(soil1=c(0.75,0.25,0.25),soil2=c(0.25,0.75,0.75))
Теперь я хочу, чтобы вывод выглядел следующим образом:
soil$out <- c('soil1','soil2', 'soil2')
Ответ №1:
Вы можете использовать apply
в этом отношении:
soil$out <- names(soil)[apply(soil, 1, which.max)]
apply(soil, 1, which.max)
Определяет, в каких столбцах содержится (первое) максимальное значение, которое затем передается names(soil)
для определения соответствующего имени столбца.
Комментарии:
1. Аналогичная идея:
names(soil)[max.col(soil)]
Ответ №2:
использовать ifelse
по мере его векторизации
soil$out <- ifelse(soil$soil1 > soil$soil2, "soil1", "soil2")
Примечание: если вам нужны сами максимальные значения (а не имена столбцов), используйте pmax
(который также векторизуется)
soil$out2 <-pmax(soil$soil1, soil$soil2)
Ответ №3:
Не самый эффективный способ,
soil = data.frame(soil1=c(0.75,0.25,0.25),soil2=c(0.25,0.75,0.75))
#> soil
# soil1 soil2
#1 0.75 0.25
#2 0.25 0.75
#3 0.25 0.75
#Calculate max proportion for each row
soil.max<-apply(soil,1,max)
#soil.max
#[1] 0.75 0.75 0.75
#For each row, find the column index while matching with max proportion value calculated in previous step
soil$max.col<-sapply(1:nrow(soil),function(x) colnames(soil)[grep(soil.max[x],soil[x,])] )
soil
# soil1 soil2 max.col
#1 0.75 0.25 soil1
#2 0.25 0.75 soil2
#3 0.25 0.75 soil2