在列中每五行添加一行,然后除以十?

我在R文件中有三列,看起来像这样;

X61253 X61613 X66198 279 140 140 279 139 139 278 139 139 279 140 140 279 139 139 278 139 139 3624 140 140 279 139 139 279 139 139 7730 140 140 278 139 139 12180 139 139 279 3660 3660 279 140 140 15443 139 139 278 139 139 18108 5527 5164 279 140 140 

我想通过转换这个数据; 总计每列5列(单独),然后除以10。

期望的输出;

  X61253,X61613,X66198 139.4,69.7,69.7 1219,69.7,69.7 2845.9,421.7,421.7 

使用的Excel公式=sum(1:5)/10 ,= sum(6:10)/ 10,= sum(11:15)/ 10

为了促进rowsum (plafort的“df”):

 rowsum(df, rep(seq_len(ceiling(nrow(df) / 5)), each = 5)[seq_len(nrow(df))]) / 10 # X61253 X61613 X66198 #1 139.4 69.7 69.7 #2 1219.0 69.7 69.7 #3 2845.9 421.7 421.7 #4 1866.5 580.6 544.3 

一个解决scheme

 library("plyr") ss <- seq(0,nrow(x)-1)%/%5 ## grouping variable dd <- ddply(x,.(ss),colSums)/10 

受欢迎的需求,只有基地R:

 dfs <- split(x,ss) ## ss as constructed above do.call(rbind,lapply(dfs,colSums))/10 

也可以用dplyrdata.table来完成…

这是一个基本的R解决scheme:

 index <- seq(5,nrow(df), by=5) splitup <- function(vec) { s <- split(vec,cumsum(tabulate(index+1, length(vec)))); lapply(s, function(v) sum(v)/10) } sapply(df, splitup) X61253 X61613 X66198 0 139.4 69.7 69.7 1 1219 69.7 69.7 2 2845.9 421.7 421.7 3 1866.5 580.6 544.3 

回想@akrun的想法。 有一件事要注意,你的例子有18行。 有了你的数据,你是否需要额外的行被忽略?

备用

这里有一个替代function,显示你已经使用了什么间隔:

 index <- seq(5,nrow(df), by=5) splitup <- function(vec) { s <- split(vec, cut(seq_along(vec), c(-Inf, index, Inf))); lapply(s, function(v) sum(v)/10) } sapply(df, splitup) X61253 X61613 X66198 (-Inf,5] 139.4 69.7 69.7 (5,10] 1219 69.7 69.7 (10,15] 2845.9 421.7 421.7 (15, Inf] 1866.5 580.6 544.3 

感谢@Ananda Mahto的另一个想法。

数据

 df <- read.table(text="X61253 X61613 X66198 279 140 140 279 139 139 278 139 139 279 140 140 279 139 139 278 139 139 3624 140 140 279 139 139 279 139 139 7730 140 140 278 139 139 12180 139 139 279 3660 3660 279 140 140 15443 139 139 278 139 139 18108 5527 5164 279 140 140", header=T) 

一种不同的方法:

 a <- as.matrix(DF) dim <- c(5, ceiling(nrow(a) / 5), ncol(a)) #pad with NA a <- rbind(a, matrix(NA, ncol = ncol(a), nrow = 5 * dim[2] - nrow(a))) #turn into 5*4*3 array dim(a) <- dim res <- colSums(a, na.rm = TRUE) / 10 colnames(res) <- names(DF) res # X61253 X61613 X66198 #[1,] 139.4 69.7 69.7 #[2,] 1219.0 69.7 69.7 #[3,] 2845.9 421.7 421.7 #[4,] 1866.5 580.6 544.3