在数据框的每一列中找到最接近零的值 - 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
这是使用 mapply
和 sapply
的替代方法。它可能不如 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 强制转换为(命名的)向量。
我有一个包含几百列的数据框,每列都有数字数据。
对于每一列,我想确定值最接近零的单元格的值,而不是正数。
例如
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
这是使用 mapply
和 sapply
的替代方法。它可能不如 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.framedf
强制转换为 data.table ,即不进行复制。- 对于每一列,返回非正的最大值。
unlist()
将结果 data.table 强制转换为(命名的)向量。