在数据帧的每列中找到最接近零的值 - R.

时间:2016-11-18 15:53:52

标签: r loops apply

我有一个包含几百列的数据框,每列都有数字数据。

对于每一列,我想识别单元格的值,其值最接近零,而不是正数。

e.g。

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

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

3 个答案:

答案 0 :(得分:6)

我们循环遍历列(@GrabResolver(name='nexus', root='http://internal.repo.com') @GrabConfig(systemClassLoader=true) @Grab('com.microsoft.sqlserver:sqljdbc4:4.0') import groovy.sql.Sql import com.microsoft.sqlserver.jdbc.SQLServerDriver def call(name) { echo "Hello world, ${name}" Sql.newInstance("jdbc:sqlserver://ipaddress/dbname", "username","password", "com.microsoft.sqlserver.jdbc.SQLServerDriver") // sql.execute "select count(*) from TableName" } ),获取绝对值,使用sapply(...)找到最小值的索引并对列的值进行子集化。

which.min

答案 1 :(得分:1)

以下是使用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以生成子集。

答案 2 :(得分:1)

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