在数据框的每一列中找到最接近零的值 - 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)

我想要return这个向量的一些功能(有趣):

fun(df)

[1] -1 0 -11

我想我可以使用应用函数,甚至循环或管道?

我们遍历列 (sapply(...)),获取绝对值,找到具有 which.min 的最小值的索引并对列的值进行子集化。

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

这是使用 mapplysapply 的替代方法。它可能不如 akrun 的答案有效,因为它至少创建了一份 data.frame.

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

sapply(df*df, which.min) 将找到最小值的索引。这些与 data.frame 一起馈送到 mapply 以产生子集。

OP 要求

the cell with the value closest to zero, without being a positive number

(正如@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 强制转换为(命名的)向量。