Создать коэффициент на основе значений нескольких столбцов

#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