我有一个包含几百列的数据框,每列都有数字数据。
对于每一列,我想识别单元格的值,其值最接近零,而不是正数。
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
我以为我可以使用应用函数,甚至可以使用循环或管道?
答案 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)
以下是使用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
以生成子集。
答案 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强制转换为(命名)向量。