我有一个有几百列的数据框架,每个列都有数字数据。
对于每一列,我想用最接近于零的值来标识单元格的值,而不是正数。
例如:
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我想我可以应用函数,甚至可能是循环,或者管道?
发布于 2016-11-18 17:34:58
任择议定书要求
数值最接近于零的单元格,而不是正数。
(正如@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强制到(命名的)向量。发布于 2016-11-18 15:56:33
我们遍历列(sapply(...)),得到绝对值,用which.min找到最小值的索引,并将列的值子集。
unname(sapply(df, function(x) x[which.min(abs(x))]))
#[1] -1 0 -11发布于 2016-11-18 16:24:23
这里有一个使用mapply和sapply的替代方案。它可能比akrun的答案效率更低,因为它创建了至少一个额外的data.frame副本。
mapply("[", df, sapply(df*df, which.min), USE.NAMES=FALSE)
[1] -1 0 -11sapply(df*df, which.min)将找到最小值的索引。这些输入到mapply和data.frame以产生子设置。
https://stackoverflow.com/questions/40681235
复制相似问题