我在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
我出错的任何建议?
答案 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])