【问题标题】:Finding the average mean pairing of two vector找到两个向量的平均平均配对
【发布时间】:2017-09-29 22:56:20
【问题描述】:

我有一个整数变量res,它存储从一个向量到另一个向量的每个元素的总和,结果被跟踪。其中length(a) = 10length(b) = 10 or 15 or any length > length(a).

a <- 1:10
b <- 1:15
nm <- outer(seq_along(a), seq_along(b), FUN = function(x, y) sprintf('a%d + b%d', x, y))
res <- setNames(c(outer(a,b,`+`)), nm)

res 
#    a1+b1   a2+b1   a3+b1   a4+b1   a5+b1 ... a6+b15  a7+b15  a8+b15  a9+b15 a10+b15
#    2       3       4       5       6     ... 21      22      23      24      25 

如何找到每个唯一对的最大值?假设a10 + b15 = 25 是最大值,那么在第二次迭代中,任何包含a10b15 的对都将被忽略。重复此过程,直到没有唯一的对。

如何修改以下函数中的if 语句以找到最大唯一配对的平均值?还是有别的办法?

f1 <- function(x) {
  x1 <- max(x)
 repeat {
  x <- x[!grepl(sub(" \\+ ", "|", names(which.max(x))), names(x))]
  x1 <- c(x1, max(x))
  if(length(x)==1) break
   }
  return(list(x, mean(x1)))

 }

注意:这个问题是我之前question的后续问题。

【问题讨论】:

  • 我不清楚你的情况。您是说如果最大值在a7 + b9 中,那些名称中包含 a7 或 b9 的元素将不会被省略?或者像a5 + b10a10 + b15a10 + b5a5 + b15a5 + b5a10 + b10还有其他组合吗?
  • 反之,如果最大值在a7 + b9中,那么名称中包含a7b9的元素将被省略。那么在下一次迭代中,如果最大值在a3 + b3中,那么a3b3将被移除,以此类推……
  • 我对 5 部分的倍数感到困惑。您的预期输出是什么?
  • 使用您以前的解决方案将a 更改为a &lt;- 1:10bb &lt;- 1:15,我遇到了此警告no non-missing arguments to max; returning -Inf。也许这个错误解释了我想要解决的问题,即当ab 的长度不相等时。很抱歉将您与 5 部分的倍数混淆。

标签: r vector sum


【解决方案1】:

我们可以把函数改成

f2 <- function(x) {
   x1 <- max(x)
   repeat {
   i1 <- grepl(sub(" \\+ ", "|", names(which.max(x))), names(x))
 if(all(i1)) break
  x  <-  x[!i1]
  x1 <- c(x1, max(x))

}

return(list(x, mean(x1)))
}

f2(res)
#[[1]]
#a1 + b1 a1 + b2 a1 + b3 a1 + b4 a1 + b5 a1 + b6 
#      2       3       4       5       6       7 

#[[2]]
#[1] 16

【讨论】:

  • 非常感谢akrun,很抱歉回复缓慢,我正在手动计算预期输出。是的,答案是 16。你遥遥领先!
猜你喜欢
  • 1970-01-01
  • 2022-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多