我正在尝试创建一个新列(因子),它保存数据框中最大值的列名。可以将其视为数据集中每个多边形(行)的土壤类型比例。我想创建一个只包含最高比例土壤名称的新列。例如:
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')
答案 0 :(得分:3)
您可以使用apply
:
soil$out <- names(soil)[apply(soil, 1, which.max)]
apply(soil, 1, which.max)
确定哪些列包含(第一个)最大值,然后传递给names(soil)
以确定相应的列名称。
答案 1 :(得分:2)
使用ifelse
,因为它是矢量化的
soil$out <- ifelse(soil$soil1 > soil$soil2, "soil1", "soil2")
注意:如果您自己需要最大值(而不是列号),请使用pmax
(也是矢量化)
soil$out2 <-pmax(soil$soil1, soil$soil2)
答案 2 :(得分:0)
不是最有效的方式,
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