【问题标题】:How to do cumulative sum row wise?如何明智地进行累积和行?
【发布时间】:2015-01-20 21:24:13
【问题描述】:
X3            X4            X5            X6            X7            X8            X9
-63.2929      -64.9519      -65.9586      -65.2485      -63.3387      -56.749       -51.7419
-68.7098      -70.2028      -71.329       -70.5252      -68.7843      -63.0799      -58.7491
58.3993       -60.0864      -60.7925      -59.6933      -57.2357      49.8444       44.1056
-57.8334      59.6063       60.3079       -59.1852      -56.6365      -49.2706      -43.5538
-37.6082      -39.6347      -39.6647      38.4396       34.9498       -26.6984      -21.9614
37.2886       39.0565       -38.8722      -37.5427      -33.969       25.9074       21.7712
-61.972       -63.0513      63.5082       -62.2337      59.7711       -54.2189      -51.6613
-60.5783      -61.6254      -61.9812      -60.6696      58.066        -52.4656      -49.9653

从上面的矩阵中,我想按列定位具有最大和最小单元格值的单元格,然后逐行计算每两个邻居的累积和。例如;对于第 1 列,最小值为 -68.70(识别单元格)并添加(-70.2028 和 -71.329),以此类推,最小值和最大值相同。我该怎么做?

data=read.table('test.csv', header=TRUE, sep=',')

matrix=data.matrix(data)

【问题讨论】:

  • 目前还不清楚预期的输出应该是什么样子。能给我们举个例子吗?

标签: r


【解决方案1】:

这就是你要找的吗? (警告:使用不良编码实践的 hack-y 答案)

data = read.table(text = "X3            X4            X5            X6            X7            X8            X9
-63.2929      -64.9519      -65.9586      -65.2485      -63.3387      -56.749       -51.7419
-68.7098      -70.2028      -71.329       -70.5252      -68.7843      -63.0799      -58.7491
58.3993       -60.0864      -60.7925      -59.6933      -57.2357      49.8444       44.1056
-57.8334      59.6063       60.3079       -59.1852      -56.6365      -49.2706      -43.5538
-37.6082      -39.6347      -39.6647      38.4396       34.9498       -26.6984      -21.9614
37.2886       39.0565       -38.8722      -37.5427      -33.969       25.9074       21.7712
-61.972       -63.0513      63.5082       -62.2337      59.7711       -54.2189      -51.6613
-60.5783      -61.6254      -61.9812      -60.6696      58.066        -52.4656      -49.9653", header = T)

sapply(1:(ncol(data)-2), function(x) {c(sum(data[c(which.min(data[,x])),x:(x+2)]),
                                        sum(data[c(which.max(data[,x])),x:(x+2)]))})

          [,1]     [,2]      [,3]      [,4]      [,5]
[1,] -210.2416 -212.057 -210.6385 -202.3894 -190.6133
[2,]  -62.4796   60.729   61.0456   46.6910  -46.1091

第一行最小值,第二行最大值。

【讨论】:

  • 这看起来是对的,但是否有可能在找到列中的最小值和最大值后,不管负号还是正号,逐行进行求和(累积和)?
【解决方案2】:
minsum <- c()
maxsum <- c()

temp <- matrix(sample(c(-1,1),replace=T)*70*runif(70), ncol=7)
for(i in 1:(ncol(temp)-2)){
   tmin <- which.min(temp[,i])
   tmax <- which.max(temp[,i])

   minsum <- c(minsum, temp[tmin,i+1] +  temp[tmin,i + 2] )
   maxsum <- c(maxsum, temp[tmax,i+1] +  temp[tmax,i + 2] )
  }

【讨论】:

  • 如果你知道结果向量的长度(你在这里做的),如果你先分配内存,for 循环会快得多(而不是用x &lt;- c() 构建一个向量)。这意味着由于which.* 产生整数,因此最好使用minsum &lt;- maxsum &lt;- vector("integer", ncol(temp)-2)) 进行初始化
  • 此代码减去行中的负数,例如,如果列中的最小值为 -100 并且对应的行为正 ex +20,则输出为 -80,是否有可能无论符号如何,都以累积方式添加行,直到第 7 列。
  • 是的,我不确定我是否理解您的问题,但您可以更改 minsum
猜你喜欢
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多