根据多个列值创建因子

时间:2014-06-17 08:26:55

标签: r r-factor

我正在尝试创建一个新列(因子),它保存数据框中最大值的列名。可以将其视为数据集中每个多边形(行)的土壤类型比例。我想创建一个只包含最高比例土壤名称的新列。例如:

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')

3 个答案:

答案 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