我有一个包含84行和48列的数据框,并且想要为每7行中的每4个连续列计算以下统计信息:sum sum min max max每个对应于一列,然后跳转到其他4列data.frame的48列中的一个。
我找到了StackOverflow 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
答案 0 :(得分:0)
我不确定我是否完全遵循您的要求-但您可以在循环中使用索引。该循环每隔第二列获取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 )
答案 1 :(得分:0)
我还通过以下几种不同方式组合了来自多个地方的代码,并得出了很好的结论:
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)