【问题标题】:R: Index corresponding to maximum value in each rowR:每行最大值对应的索引
【发布时间】:2019-02-27 21:58:08
【问题描述】:

我有一个 744 x 3 矩阵(名为 Sharpe_a),我正在循环创建一个数据帧,该数据帧由对应于每行最大值的索引值组成(名为 last_bestIndex_colnum)

问题在于它将具有相同绝对值但相反符号的两个值视为等价物。

        sr_sig_fx sr_comm_i sr_comm_ii
[1,]        NA        NA         NA
[2,]        NA    0.2632    -0.5714
[3,]   -0.3684    0.3684    -0.2222
[4,]    0.3846   -0.3846    -0.5000

所以当使用 grep 来识别包含第 3 行最大值的列时,例如,我得到以下内容

> grep(max(x[3,]),x[3,])
[1] 1 2

所以它认为 -0.3684 和 0.3684 是相同的值而不是只返回 2,所以返回 1 和 2。但是,我测试 x[3,1] > x[3,2] 并返回“FALSE” ,然后 x[3,1]

structure(c(NA, NA, -0.3684, 0.3846, 0.7, 0.7, 0.7895, 0.9412, 
0.55, 0.25, NA, 0.2632, 0.3684, -0.3846, -0.7, -0.7, -0.7895, 
-0.9412, -0.55, -0.25, NA, -0.5714, -0.2222, -0.5, -0.7, -0.7, 
-0.7895, -1, -0.8235, -1), .Dim = c(10L, 3L), .Dimnames = list(
    NULL, c("sr_sig_fx", "sr_comm_i", "sr_comm_ii")))

【问题讨论】:

  • 你试过max.col(replace(x, is.na(x), -Inf)) 吗?
  • 这似乎是一个很好的解决方案——但是,例如,对于所有 3 列都是 NA 的行,它会返回“3”。当行中的最大值存在关联时,我还需要有 NA。有没有办法

标签: r loops max


【解决方案1】:

当你像这样使用 grep 时,它正确地将 0.3684 识别为最大值,然后返回所有包含 0.3684 的列,无论是否为负; grep 用于字符串。试试:

which(x[1,] == max(x[1,][!is.na(x[1,]))

编辑: 刚刚在 cmets 中注意到,当两个值之间存在联系时,您想要返回 NA。这可以这样完成:

result <- which(x[1,] == max(x[1,][!is.na(x[1,]))
result <- ifelse(length(result) > 1, NA, result)

【讨论】:

  • 当我运行您的解决方案时,我得到:last_bestIndex_colnum[i, j] 中的错误:矩阵上的下标数量不正确另外:警告消息:在 max(x [1, ][!is.na(x[1, ])]) : max 没有非缺失参数;返回 -Inf
  • 我重新安排了您建议中的条款,并相信我找到了我需要的内容: ifelse(length(which(sharpe_a[[j]][i,] == max ( sharpe_a[[j]] [i,],na.rm=T))) > 1, NA,which(sharpe_a[[j]][i,] == max (sharpe_a[[j]][i,],na.rm=T )))
  • 好东西,我猜连续所有值都是 NA 的情况可能会影响我的建议。很高兴你找到了让它发挥作用的方法。 PS。如果您想进一步发展您的 R 技能,我强烈建议您阅读这本(免费)书。你会学到很多技巧来帮助你处理你在这篇文章中概述的那种东西。 r4ds.had.co.nz/index.html
猜你喜欢
  • 1970-01-01
  • 2020-10-14
  • 2016-07-14
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2021-08-25
相关资源
最近更新 更多