【问题标题】:Find Nth largest Across Columns (NOT in a vector)跨列查找第 N 个最大的(不在向量中)
【发布时间】:2018-04-06 23:41:01
【问题描述】:

考虑以下示例:

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 中,已经存在用于查找元素最大值和最小值的函数,因此我可以轻松地创建一个新变量,该变量等于感兴趣的列中的最大值(或最小值):

> 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 会先将数据集转换为矩阵,我的数据集不会接受。

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

【问题讨论】:

  • 行级操作往往很慢,尤其是对于 data.frames。如果您的所有列都是数字,则最好使用矩阵以提高速度。同样,您可以考虑转置数据并在列上运行此类查询。

标签: r


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2015-08-03
    相关资源
    最近更新 更多