【问题标题】:Find value closest to zero in each column of a data frame - R在数据框的每一列中查找最接近零的值 - R
【发布时间】:2016-11-18 15:53:52
【问题描述】:

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

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

例如

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

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

【问题讨论】:

  • 为什么要使用管道?
  • Q 要求 确定位置,但您的 fun(df) 返回值。请问你的目标是什么?
  • 编辑,抱歉,英语不好,我的意思是“确定价值”而不是“确定位置”

标签: r loops apply


【解决方案1】:

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

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

【讨论】:

  • 要获得“最接近零的值,而不是正数。”,你不需要min(x[x&lt;=0])吗?
  • @Heroka:你需要max(x[x&lt;=0])。
  • 感谢您的回答,它最终引导我为我的特定实例找到正确的答案,但不幸的是,正如@Heroka 所说,@Heroka 说,max(x[x&lt;=0]) 有效地在我的完整数据集上返回了一些正数。
  • @JohnGodlee 没问题。我按照您发布的示例进行编码
  • 出于兴趣,你知道我如何找到这些值的位置(列和行号)吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2015-07-17
      相关资源
      最近更新 更多