簡體   English   中英

在數據幀的每一列中查找最接近零的值-R

[英]Find value closest to zero in each column of a data frame - R

我有一個包含幾百列的數據框,每列都有數字數據。

對於每一列,我想標識單元格的值,該值最接近零,而不是正數。

例如

X = c(-1,-2,-3,-4,-5,-6,-7,-8,-9,-10)
Y = c(5,4,3,2,1,0,-1,-2,-3,-4)
Z = c(-11,-12,-13,-14,-15,-16,-17,-18,-19,-20)

df <- data.frame(X, Y, Z)

我想要一些函數(有趣)來返回此向量:

fun(df)

[1] -1 0 -11

我以為我可以使用Apply函數,甚至可以使用循環或管道?

我們遍歷各列( sapply(...) ),獲取絕對值,找到其中which.min的最小值的索引,並對該列的值進行子集化。

unname(sapply(df, function(x) x[which.min(abs(x))]))
#[1]  -1   0 -11

OP要求

值最接近零而不是正數的單元格

(由@Heroka指出),返回值的向量作為預期結果。

這可以使用data.table實現:

library(data.table)
setDT(df)[, unlist(lapply(.SD, function(x) max(x[x<=0])))]

  X Y   Z
 -1 0 -11

說明

  • setDT(df) 通過引用將data.frame df強制轉換為data.table,即不進行復制。
  • 對於每一列,返回不為正的最大值。
  • unlist()將結果data.table強制轉換為(命名的)向量。

這是使用mapplysapply的替代方法。 它可能會比akrun的回答效率低,因為它會創建至少一個額外的data.frame副本。

mapply("[", df, sapply(df*df, which.min), USE.NAMES=FALSE)
[1]  -1   0 -11

sapply(df*df, which.min)將找到最小值的索引。 這些饋送到mapply與data.frame以產生子集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM