gpt4 book ai didi

r - 强制which()仅返回第一个匹配项

转载 作者:行者123 更新时间:2023-12-02 21:15:21 25 4
gpt4 key购买 nike

我正在开发的函数的一部分使用以下代码来获取数据框并根据每列中的最大(绝对)值重新排序其列。

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()返回:“‘orderVector1’中未实现的类型‘list’”。)这是因为which( ) 返回 C 列中的所有 1,这反过来又使 apply() 吐出一个列表,而不是一个漂亮的整洁向量。

我的问题是:在这种情况下,如何使which()只为C列返回一个值?或者,是否有更好的方法来编写此代码来执行我想要的操作(根据每列中的最大值对矩阵的列进行重新排序,无论该最大值是否重复),而不会出现此问题?

最佳答案

如果您只想选择结果的第一个元素,可以使用 [1] 将其子集化:

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

关于r - 强制which()仅返回第一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31058487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com