1

これはおそらくすでに質問されていますが、見つかりませんでした。列名が数字で、行名がサンプル名であるデータセットがあります (以下を参照)。

"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 は、ビニングされた列名の平均です。カットのようなものは数値のベクトルに対して機能すると思いますが、大きなデータ フレームに対してそれを実装する方法がわかりません。助けてくれてありがとう!

4

2 に答える 2

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
于 2013-07-11T18:14:51.027 に答える
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
于 2013-07-11T17:57:11.037 に答える