【问题标题】:how to calculate different statistics for each n rows every m columns in a data frame如何为数据框中每 m 列的每 n 行计算不同的统计信息
【发布时间】:2026-01-15 01:45:01
【问题描述】:

我有一个包含 84 行和 48 列的数据框,并且希望在每 7 行中为每 4 个连续列计算以下统计信息: sum sum min max 每个对应于一列,然后跳转到其他 4 列data.frame 的 48 列中。

我找到了* post already,但它不适用于我的所有 data.frame。它只适用于每一列,每列每次只做一个统计。

v=dataset$count
n = 7
sidx = seq.int(from=1, to=length(v), by=n)
eidx = c((sidx-1)[2:length(sidx)], length(v))
thesum = sapply(1:length(sidx), function(i) sum(v[sidx[i]:eidx[i]]))
thesum
 [1] 10957 10955 10953 10955 10954 10955 10957 10956 10958 10953 10954    10956

【问题讨论】:

  • 为什么要列出两次 sum?
  • 我必须对第一列第二列求和,并得到每 48 列的第三和第四的最大值和最小值

标签: r statistics


【解决方案1】:

我不确定我是否完全符合您的要求 - 但您可以在循环中使用索引。此循环每隔一列获取 7 行的汇总统计信息。

#making example data
ir <- iris[ 1:84 , 1:4]
ir <- do.call(cbind,  rep( ir, 12))

# this is the size you specfied
dim( ir )

FINAL <- NULL

# For every set of seven rows
for( i in seq( 1 , nrow( ir) , 7 ) ){
# For every set of four columns
OUT <- NULL
    for( j in seq( 1 , ncol( ir) , 4 ) ){


      out <- cbind(
        sum1 =  sum(  ir[ i:(i+6) ,  j ]  ),
        sum2 =  sum(  ir[ i:(i+6) ,  j+1 ]  ),
        min1 =  min(  ir[ i:(i+6) ,  j+2 ]  ),
        max1 =  max(  ir[ i:(i+6) ,  j+3 ]  )
      )

     OUT <- cbind( OUT , out )

}

    FINAL <- rbind( OUT , FINAL)
}

#output object match your specification
dim( FINAL )

【讨论】:

  • 请在下面解释一下
  • 我需要一个 84 行和 48 列的数据框,每四列有 7 个行元素的块:第一列:“sum”,第二列:“sum”,第三列“min” , 第四列:"max" 按此顺序直到第 48 列...
  • @Gab - 为什么你有两个总和?最终输出是什么样的?你是在 48 个列上运行这四个统计数据,还是 12 个组,每组 4 个列。
  • 我想我可能没有正确解释它:我有一个 84 行和 48 列的数据框,需要对每 4 列执行以下重复:取第一个列的每 7 行元素和求和;取第二列的每 7 行元素并求和;取第三列的每 7 行元素并做 min;取第四列的每 7 行元素并做最大值;这一切都是为了 48 列。最后我应该得到一个 12(84 行/7 行)行和 48 列的数据框。
  • 我认为是不错的代码,但您的结果与我刚才放在上面的结果有所不同...。我认为在您或我的代码中没有采用第 7 行元素为每列进行统计...让我知道您的想法?
【解决方案2】:

我还结合了几个地方的代码,以不同的方式如下所示,效果很好:

n = 7
sidx = seq.int(from=1, to=nrow(dataset), by=n)
eidx = c((sidx-1)[2:length(sidx)], nrow(dataset))
# cerate a data frame
k=data.frame(matrix(nrow = 12,ncol = 48))

for (i in 1:12){
   for(j in 1:12){
      k[i,(4*j)-3]=apply(dataset[sidx[i]:eidx[i],(4*j)-1],2, sum)
      k[i,(4*j)-2]=apply(dataset[sidx[i]:eidx[i],(4*j)], 2,sum)
      k[i,(4*j)-1]=apply(dataset[sidx[i]:eidx[i],(4*j)+1], 2,min)
      k[i,(4*j)]=apply(dataset[sidx[i]:eidx[i],(4*j)+2], 2,max)
 }
}
View(k)

【讨论】:

    最近更新 更多