当前位置: 首页 > 知识库问答 >
问题:

高效提取数据框中每一列和每一行的最小值和索引,然后按值排序

王轶
2023-03-14

我有一个JxK数据帧M,我想计算以下内容。

  1. 对于每一行j,使M[j,k]最小的值k

然后,让满足第一个向量A_j和第二个向量A_k的值。然后,我需要两个向量。设向量C为向量排序(C(A_j,A_k))。

  1. 长度等于A_j的向量,其中元素i是组合和排序向量C中元素A_j[i]的html" target="_blank">索引。
  2. 长度等于A_k的向量,其中元素i是组合和排序向量C中元素A_k[i]的索引

对于上面提到的两个排序向量,所有关系都应该给出该值出现在向量C中的第一个索引。也就是说,如果A_j[i]和A_j[i 1]相等,那么向量中满足条件#3的元素i和元素i 1都应该等于A_j[i]在排序向量C中的位置。

和往常一样,这并不难做到效率低下。然而,在实践中,数据帧非常大,因此低效的解决方案失败。

作为概念证明,一种解决方案如下。

# Create the dataframe
set.seed(1)
df <- data.frame(matrix(rnorm(50, 8, 2), 10)) # A 10x5 matrix

# Calculate 1 and 2
A.j <- apply(df, 1, min) 
A.k <- apply(df, 2, min)

# Calculate 3 and 4
C <- sort(unname(c(A.j, A.k)))

A.j.indices <- apply(df, 1, function(x) which(x == min(x)))
A.k.indices <- apply(df, 2, function(x) which(x == min(x)))

vec3out <- c()
vec4out <- c()

for(j in 1:nrow(df)){
   rank <- which(C == A.j[j])[1] 
   vec3out <- c(vec3out, rank)
}

for(k in 1:ncol(df)){
   rank <- which(C == A.k[k])[1] 
   vec4out <- c(vec4out, rank)
}

共有1个答案

杭昊空
2023-03-14

首先,您应该使用矩阵。Data.frames效率较低(我应该使用data.frame还是矩阵?)。然后,我们应该使用应用函数。

设M为强制为矩阵的data.frame。

M <- as.matrix(M)

minByRow <- apply(M, MARGIN=1, FUN=which.min)
minByCol <- apply(M, MARGIN=2, FUN=which.min)

combinedSorted <- sort(c(minByRow, minByCol))

byRowOutput <- match(minByRow, combinedSorted)
byColOutput <- match(minByCol, combinedSorted)

以下是100个变量的100万次观测结果:

M <- matrix(data=rnorm(100000000), nrow=1000000, ncol=100)


system.time({
  minByRow <- apply(M, MARGIN=1, FUN=which.min)
  minByCol <- apply(M, MARGIN=2, FUN=which.min)

  combinedSorted <- sort(c(minByRow, minByCol))

  byRowOutput <- match(minByRow, combinedSorted)
  byColOutput <- match(minByCol, combinedSorted)
})

   user  system elapsed 
   7.37    0.46    7.93 
 类似资料:
  • 我试图找到矩阵中每列的最小值和最大值,但我当前的代码运行不正确。我试图把最小值放在一个新矩阵的第一行,最大值放在下一行,并对每一列这样做。任何帮助都将不胜感激,谢谢!

  • 请帮助我,我已经有一个代码,它运行完美,但问题是我需要确定每行的最高和最低。我不知道如何开始,请帮助我,也请向我解释。这是代码:

  • 我使用的是Apache Spark,它的数据帧如下所示: 我想按字段分组,以获得的所有历元时间戳。然后我想按时间戳升序对历代进行排序,然后取第一个和最后一个历代。 我使用了下面的查询,但是和历元值似乎是按照它们在原始数据帧中出现的顺序获取的。我想把第一个和最后一个从一个有序的升序中取出来。 如何从按升序历元排序的历元列表中检索第一个和最后一个历元?

  • 问题内容: 我正在尝试编写一个查询,每天从价格明细表中获取每个商品的最低和最高价格。 在价格明细表中,每天设置多次价格,因此同一日期有很多记录。因此,我想要一个表,其中每个日期都有一行,然后将该表连接到同一张表,因此对于每个不同的日期,我都需要最小值和最大值。 SQL查询 概括 餐桌在同一天设定了许多价格。想要每个交易所报价的每天的最小值和最大值。 谢谢 问题答案: 一个简单的应该工作: 不知道为

  • 我有一个名为的,它有4列,如下所示: 我想要的是找到关于类的每一列的最小值和最大值。换句话说,我希望得到一个类似于下面的结果:

  • 使用Python中的2D掩蔽数组,获取包含非掩蔽值的第一行和最后一行和列的索引的最佳方法是什么? 在本例中,我希望获得: 轴0的(因为具有未屏蔽值的第一行为0,最后一行为4;第六行(第5行)仅包含屏蔽值) [我想过也许结合和,没有任何成功...]