获取data.frame行中最小值列的索引

时间:2016-01-29 01:11:15

标签: r

DF = structure(list(a = c(1L, 2L, 5L), b = c(2L, 3L, 3L), c = c(3L, 1L, 2L)), .Names = c("a", "b", "c"), row.names = c(NA, -3L), class = "data.frame")

a b c 
1 2 3 
2 3 1 
5 3 2

如何创建其他列,每个列包括行最小,中间和最大列的名称或索引,如下所示?

a b c min middle max
1 2 3   a      b   c
2 3 1   c      a   b
5 3 2   c      b   a

2 个答案:

答案 0 :(得分:4)

一种方法是使用Data <-cbind(Data, (Data$T0 + Data$Recovery_rate * Data$Disturbance_freq)- Data$Impact * (Data$T0+Data$Recovery_rate * Data$Disturbance_freq)/100) Data <-cbind(Data, (Data$T1 + Data$Recovery_rate * Data$Disturbance_freq)-Data$Impact * (Data$T1+Data$Recovery_rate * Data$Disturbance_freq)/100) 循环遍历行,按指示的顺序返回列名称:

apply

此解决方案假设您有三列(因此中间是第二大列)。如果不是这种情况,您可以通过以下修改推广到任意数量的列:

cbind(DF, t(apply(DF, 1, function(x) setNames(names(DF)[order(x)],
                                              c("min", "middle", "max")))))
#   a b c min middle max
# 1 1 2 3   a      b   c
# 2 2 3 1   c      a   b
# 3 5 3 2   c      b   a

答案 1 :(得分:3)

正如OP提到的关于data.table,这是data.table的一种方式。将'data.frame'转换为'data.table'(setDT(DF)),按行序列分组,我们unlist数据集,order值,将其用作索引订购列名,通过分配(转换为list后)创建三列。

 library(data.table)
 setDT(DF)[, c('min', 'middle', 'max') :=
    as.list(names(DF)[order(unlist(.SD))]) ,1:nrow(DF)][]
 #   a b c min middle max
 #1: 1 2 3   a      b   c
 #2: 2 3 1   c      a   b
 #3: 5 3 2   c      b   a