2015-06-25 49 views
2

我正在处理的函数的一部分使用以下代码来获取数据框并根据每列中的最大(绝对)值对其列进行重新排序。r - 强制哪个()仅返回第一个匹配

ord <- order(abs(apply(dfm,2,function(x) x[which(abs(x) == max(abs(x)), arr.ind = TRUE)]))) 

在大多数情况下,这工作得很好,但随着数据集我的工作,我偶尔会看起来像这样的数据:

a <- rnorm(10,5,7); b <- rnorm(10,0,1); c <- rep(1,10) 
dfm <- data.frame(A = a, B = b, C = c) 

> dfm 
     A   B  C 
1 0.6438373 -1.0487023 1 
2 10.6882204 0.7665011 1 
3 -16.9203506 -2.5047946 1 
4 11.7160291 -0.1932127 1 
5 13.0839793 0.2714989 1 
6 11.4904625 0.5926858 1 
7 -5.9559206 0.1195593 1 
8 4.6305924 -0.2002087 1 
9 -2.2235623 -0.2292297 1 
10 8.4390810 1.1989515 1 

发生这种情况时,上面的代码返回abs()步骤中出现“数学函数的非数字参数”错误。 (如果我摆脱了abs()步骤,因为我知道,由于转换,我的数据将全部为正数,order()返回:“未实现类型'列表'in orderVector1'”)。这是因为哪个)返回列C中的所有1,这又使apply()吐出一个列表,而不是一个漂亮的整洁向量。

我的问题是这样的:我怎样才能让这()在这种情况下J列返回一个值?或者,有没有更好的方式来编写这段代码来做我想做的事情(根据每列中最大的值对矩阵的列进行重新排序,无论这个最大值是否被重复)不会有这个问题?

+1

我想,没有更好的方法可以做到这一点。你可以用'x [which.max(abs(x))]代替'[[(abs(x)== max(abs(x)),arr.ind = TRUE)] [1] ',但是。哦,等等,只是意识到你最后也在申请'abs'。你可以这样做:'apply(abs(dfm),2,max)' – Frank

+1

@Frank这会让它更整洁!很高兴知道我至少在关于如何在R.中正确地做到这一点。 – plagueheart

回答

2

如果你想只选择结果的第一个元素,你可以用[1]子集是:

​​
+1

我知道这是一件容易的事情。谢谢! – plagueheart

2

要订购通过他们的最大元素的列(绝对值),你可以做

dfm[order(apply(abs(dfm),2,max))] 

虽然你的代码,@ CarlosCinelli的更正应该可以正常工作。

相关问题