汇总列

用户名

我有n列和r行的数据框。我想确定哪一列与第1列最相关,然后合计这两列。聚合列将被视为新列1。然后,从集合中删除最相关的列。因此,日期的大小将减少一列。然后,我重复该过程,直到数据帧result具有n列,第二列是两列的聚合,第三列是三列的聚合,以此类推。因此,我想知道是否有一种有效或更快速的方法以获得我想要的结果。我已经尝试过各种方法,但到目前为止还没有成功。有什么建议?

n <- 5
r <- 6


> df
    X1   X2   X3   X4   X5
1 0.32 0.88 0.12 0.91 0.18
2 0.52 0.61 0.44 0.19 0.65
3 0.84 0.71 0.50 0.67 0.36
4 0.12 0.30 0.72 0.40 0.05
5 0.40 0.62 0.48 0.39 0.95
6 0.55 0.28 0.33 0.81 0.60

这是result应该是这样的:

> result
    X1   X2   X3   X4   X5
1 0.32 0.50 1.38 2.29 2.41
2 0.52 1.17 1.78 1.97 2.41
3 0.84 1.20 1.91 2.58 3.08
4 0.12 0.17 0.47 0.87 1.59
5 0.40 1.35 1.97 2.36 2.84
6 0.55 1.15 1.43 2.24 2.57
咖啡因垃圾

尝试

for (i in 2:n) {
  maxcor <- names(which.max(sapply(temp[,-1, drop=F], function(x) cor(temp[, 1], x) )))
  result[,i] <- temp[,1] + temp[,maxcor] 
  temp[,1] <- result[,i] # Set result as new 1st column
  temp[,maxcor] <- NULL # Remove column
}

造成此错误的原因是,在最后一次迭代中,子集temp产生单个向量,并且在这种情况下,标准R行为是将类从数据帧减少到向量,这导致sapply仅传递第一个元素,依此类推。

还有一条评论:当前,您使用的是最正的相关性,而不是最强的相关性,也可能是负相关性。确保这是您想要的。


要在评论中解决您的问题:请注意,可以通过避免重复计算来改进您的旧代码。例如,

   mch <- match(c(max(cor(temp)[-1,1])),cor(temp)[,1])

包含cor(temp)两次命令这意味着每个相关都被计算两次。替换为

  cortemp <- cor(temp)
  mch <- match(c(max(cortemp[-1,1])),cortemp[,1])

应该将初始代码行的计算负担减少一半。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章