在列上使用apply()来输出子集

时间:2014-04-22 18:06:26

标签: r subset apply

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

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

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

> 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

我出错的任何建议?

4 个答案:

答案 0 :(得分:3)

您的解决方案不起作用的原因是传递给您的用户定义函数的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])

答案 1 :(得分:3)

另一种变化:

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

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

答案 2 :(得分:2)

快速且不复杂的解决方案可能是:

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

答案 3 :(得分:1)

尝试:

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])