【问题标题】:Using apply() over columns to output subsets在列上使用 apply() 来输出子集
【发布时间】:2014-06-07 06:27:50
【问题描述】:

我在R 中有一个数据框,其中大部分列是值,但只有一个字符列。对于除字符列之外的每一列,我想对超过阈值的值进行子集化,并获得字符列中的相应值。

我无法找到包含我想要的数据模式的内置数据集,因此可以访问我的数据的dputhere

当我使用子集时,我得到了我期望的输出:

> df[abs(df$PA3) > 0.32,1]
[1] "SSI_01" "SSI_02" "SSI_04" "SSI_05" "SSI_06" "SSI_07" "SSI_08" "SSI_09"

当我尝试使用 apply 迭代数据框的列时,我得到一个递归错误:

> apply(df[2:10], 2, function(x) df[abs(df[[x]])>0.32, 1])
 Error in .subset2(x, i, exact = exact) : 
  recursive indexing failed at level 2

有什么建议我哪里出错了吗?

【问题讨论】:

    标签: r subset apply


    【解决方案1】:

    另一种变化:

    apply(abs(df[-1]) > .32, 2, subset, x=df[[1]])
    

    这里可爱的技巧是通过指定x 参数来“咖喱”子集。我希望我可以用[ 来做这件事,但这并不能以典型的方式处理命名参数,因为它是一个原始函数:..(

    【讨论】:

    • 我也没见过这个把戏;在R 中总是有 n+1 种剥猫皮的方法!
    【解决方案2】:

    您的解决方案不起作用的原因是传递给您的用户定义函数的x 实际上是df 的一列。因此,您只需稍作修改(将 df[[x]] 替换为 x)即可让您的解决方案工作:

    apply(df[2:10], 2, function(x) df[abs(x)>0.32, 1])
    

    您可以使用... 参数到apply 来传递额外的参数。在这种情况下,您需要传递第一列:

    apply(df[2:10], 2, function(x, y) y[abs(x) > 0.32], y=df[,1])
    

    【讨论】:

    • 这很好用,结果列表中的每个项目都以从中提取值的列命名,这非常有用。感谢您还解释了为什么我的解决方案尝试不起作用。
    【解决方案3】:

    试试:

    lapply(df[,2:10],function(x) df[abs(x)>0.32, 1])

    或者使用apply:

    apply(df[2:10], 2, function(x) df[abs(x)>0.32, 1])

    【讨论】:

      【解决方案4】:

      一个快速且简单的解决方案可能是:

       sapply(2:10, function(x) df[abs(df[,x])>0.32, 1])
      

      【讨论】:

      • 这很好用,但上面使用apply 的解决方案也给出了合理的列表项名称,这是一个奖励。
      猜你喜欢
      • 2014-01-16
      • 2014-01-11
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 2017-01-27
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多