分区和命名具有平移列平均值的新列

时间:2013-07-11 17:08:33

标签: r

这可能已经被问过了,但我找不到了。我有一个数据集,其中列名是数字,行名是样本名(见下文)。

"599.773" "599.781" "599.789" "599.797" "599.804" "599.812" "599.82" "599.828" 
"A" 0 0 0 0 0 2 1 4  
"B" 0 0 0 0 0 1 0 3  
"C" 0 0 0 0 2 1 0 1  
"D" 3 0 0 0 3 1 0 0 

我希望通过求和来对列进行分区,比如说每4列,然后使用分箱列的平均值命名新列。对于上表,我最终会得到:

"599.785" "599.816" 
"A" 0 7 
"B" 0 4  
"C" 0 4  
"D" 3 4 

新列名称599.785和599.816是已分箱的列名的平均值。我认为像剪切这样的东西可以用于数字向量,但我不确定如何为大数据帧实现它。谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

colnames <- c("599.773", "599.781", "599.789", "599.797", 
              "599.804", "599.812" ,"599.82" ,"599.828" )
mat <- matrix(scan(), nrow=4, byrow=TRUE)
 0 0 0 0 0 2 1 4  
  0 0 0 0 0 1 0 3  
  0 0 0 0 2 1 0 1  
  3 0 0 0 3 1 0 0 

 colnames(mat)=colnames
 rownames(mat) = LETTERS[1:4]

 sRows <- function(mat, cols) rowSums(mat[, cols])
 sapply(1:(dim(mat)[2]/4), function(base) sRows(mat, base:(base+4)) )

  [,1] [,2]
A    0    2
B    0    1
C    2    3
D    6    4

accum <- sapply(1:(dim(mat)[2]/4), function(base) 
                      sRows(mat, base:(base+4)) )
colnames(accum) <- sapply(1:(dim(mat)[2]/4), 
                          function(base)   
                      mean(as.numeric(colnames(mat)[ base:(base+4)] )) )
accum
#-------
  599.7888 599.7966
A        0        2
B        0        1
C        2        3
D        6        4

答案 1 :(得分:0)

首先使用数值作为列名称不是一个好的/标准的习惯。

即使我在这里提供解决方案作为所需的OP。

## read data without checking names 
dt <- read.table(text='
"599.773" "599.781" "599.789" "599.797" "599.804" "599.812" "599.82" "599.828" 
"A" 0 0 0 0 0 2 1 4  
"B" 0 0 0 0 0 1 0 3  
"C" 0 0 0 0 2 1 0 1  
"D" 3 0 0 0 3 1 0 0',header=TRUE, check.names =FALSE)

cols <- as.numeric(colnames(dt))
## create a factor to groups columns
ff   <- rep(c(TRUE,FALSE),each=length(cols)/2)
## using tapply to group operations by ff 
vals <- do.call(cbind,tapply(cols,ff,
       function(x)
         rowSums(dt[,paste0(x)])))
nn <- tapply(cols,ff,mean)
## names columns with means
colnames(vals) <- nn[colnames(vals)]

vals
  599.816 599.785
A       7       0
B       4       0
C       4       0
D       4       3