找到第N个最大的列(不在向量中)

时间:2017-10-25 18:45:53

标签: r

考虑以下示例:

Var_A <- sample(1:100,5,replace=TRUE)
Var_B <- sample(1:100,5,replace=TRUE)
Var_C <- sample(1:100,5,replace=TRUE)
Var_D <- sample(1:100,5,replace=TRUE)

DF <- as.data.frame(cbind(Var_A,Var_B,Var_C,Var_D))

在R中,函数已经存在以找到以元素为单位的max和min,因此我可以轻松地创建一个新变量,该变量等于感兴趣列中的最大(或最小)值:

> DF$Max <- pmax(Var_A,Var_B,Var_C,Var_D)
> DF
  Var_A Var_B Var_C Var_D Max
1    44    33     6    72  72
2    29    66    51    12  66
3    35    29    47    79  79
4    39    79    47    65  79
5    97    60    36    81  97

但是如果我需要创建一个变量来捕获比如每行中的第二大值(即跨列)?

在我正在使用的真实数据集中,我有600多列和大约2800万条记录。我需要创建变量来识别和存储在查看每条记录的变量(列)时找到的最大,第二大,第三大等值,就像pmax那样,但对于其他序数。

我能够在功能上使其在数据的子集上工作的唯一方法是进行循环,但是如果我在整个数据集上运行它,那么该循环在我的生命周期中不会完成。我还考虑过使用apply函数,但我的理解是apply会首先将数据集转换为矩阵,我的数据集不会对此感兴趣。

有关非循环方式的任何建议吗?有了这么多的数据,越快越好......

1 个答案:

答案 0 :(得分:1)

这可能是一个解决方案......

            Var_A <- sample(1:100,5,replace=TRUE)
            Var_B <- sample(1:100,5,replace=TRUE)
            Var_C <- sample(1:100,5,replace=TRUE)
            Var_D <- sample(1:100,5,replace=TRUE)

            DF <- as.data.frame(cbind(Var_A,Var_B,Var_C,Var_D))




            result <-sapply(1:nrow(DF), function(x) {

                    df <- as.data.frame(DF[x,])
                    ord <- df[order(-DF[x,])]




                    })

            result <- t(result)

            output <- cbind(DF,result)

            for (i in (ncol(DF)+1):ncol(output) )  {

            colnames(output)[i]<-paste0("Max",i-ncol(DF)) 

            }

            output

         Var_A Var_B Var_C Var_D Max1 Max2 Max3 Max4
      1    42    12    64     9   64   42   12    9
      2    67    22    47     4   67   47   22    4
      3    80    56    82    94   94   82   80   56
      4    31    62    88    73   88   73   62   31
      5    91    67    15    41   91   67   41   15