如何从 R 数据帧中分离出最小的量级值

How isolate just the smallest magnitude values from an R data frame

我的问题

我有以下(简化的)数据框df

        A    B    C
[1,]    2   -5   20
[2,]  -10   -1   10
[3,]   10  -10    0 

我只想隔离最小量级的值:

[ 2, -1, 0 ]

我该怎么做?

我试过的

到目前为止,我刚刚得到它来告诉我每行的最小 绝对 值是多少:

  MagMin <- vector()
  
  for(i in 1:nrow(df)){ 
    sub <- df[i,]
    MagMin[i] <- min(abs(df[i,]))
    }

这给了我 [2, 1, 0],但显然,我已经失去了最小值走向的标志。

我在 中找到了一个很好的问题答案,但我想不出如何在此处应用它!

apply(mat, 1, function(z) z[which.min(abs(z))])
# [1,] [2,] [3,] 
#    2   -1    0 

Walk-through:

  • 当你想要最小-幅度时,min(abs(val))会return正的,你知道......

    val <- c(-10L, -1L, 10L)
    min(abs(val))
    # [1] 1
    
  • 我们可以用which.min(abs(val))来确定向量中的哪个是min-magnitude, return 是矢量的索引:

    which.min(abs(val))
    # [1] 2
    
  • 使用它,我们可以根据 min-magnitude:

    提取特定值(pos 或 neg)
    val[which.min(abs(val))]
    # [1] -1
    
  • 对每一行重复操作,我们使用apply(mat, 1, ...)1 用于 MARGIN=1 ,意思是“按行”,第三个参数 (FUN=) 是一个函数,它只接受一个参数并用它做一些事情;在这种情况下,第一次调用时,z 实际上是 mat[1,],其值为 c(2, -5, 20);第二次,它实际上是 mat[2,],值为 c(-10, -1, 10);等等


数据

mat <- structure(list(A = c(2L, -10L, 10L), B = c(-5L, -1L, -10L), C = c(20L, 10L, 0L)), class = "data.frame", row.names = c("[1,]", "[2,]", "[3,]"))