2015-12-20 1 views
5

私は反復測定値を表す変数の "波"を作成しようとしています。具体的には、変数1〜10,11〜20〜91〜100の平均値を表す連続変数を作成しようとしています。 「...」は3から9までの波の変数を表しています。これは入力を避けることが私の目標です!ここで 複数の連続する列を突き合わせる(dplyrまたは基数Rで)

は10行と100列の例のデータフレーム、 df、次のとおりです。私は一度、すべての変数が入力されている作品 dplyr機能 mutateを使用しました

mat <- matrix(runif(1000, 1, 10), ncol = 100) 
df <- data.frame(mat) 
dim(df) 
> 10 100 

が、時間集約的であると間違いを起こしやすい私は以下の始めとして、私は、手動で列の名前を入力するために頼ることなく、そうする方法を見つけることができていない(「...」〜9波3を象徴していることに注意してください):

df <- df %>% 
     mutate(wave_1 = (X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10)/10, 
      wave_2 = (X11 + X12 + X13 + X14 + X15 + X16 + X17 + X18 + X19 + X20)/10, 
      ... 
      wave_10 = (X91 + X92 + X93 + X94 + X95 + X96 + X97 + X98 + X99 + X100)/10) 

mutate複数の/連続する列を 'dplyr'で変更できますか?他のアプローチも歓迎されます。

+1

dplyrと一緒にいなければなりませんか? –

+0

いいえ、ありがとうございます - 別の解決策も素晴らしいです –

答えて

5

はここでパッケージzooとの一つの方法である:

ここ
library(zoo) 
t(rollapply(t(df), width = 10, by = 10, function(x) sum(x)/10)) 

は、ベースRでそれを行うための一つの方法である:ベースR(G.の礼儀と

splits <- 1:100 
dim(splits) <- c(10, 10) 
splits <- split(splits, col(splits)) 
results <- do.call("cbind", lapply(splits, function(x) data.frame(rowSums(df[,x]/10)))) 
names(results) <- paste0("wave_", 1:10) 
results 

もう一つの非常に簡潔な方法グロタンディーク):

t(apply(df, 1, tapply, gl(10, 10), mean)) 

そしてここでは、dplyrととソリューションです。:

library(dplyr) 
library(tidyr) 
df$row <- 1:nrow(df) 
df2 <- df %>% gather(column, value, -row) 
df2$column <- cut(as.numeric(gsub("X", "", df2$column)),breaks = c(0:10*10)) 
df2 <- df2 %>% group_by(row, column) %>% summarise(value = sum(value)/10) 
df2 %>% spread(column, value) %>% select(-row) 
+0

ありがとう、誰かがdplyrを使用して答えを持っているかどうかを確認するために、私は待っています –

+1

@JoshuaRosenberg確かに、急いでする必要はありません –

+0

@ G.Grothendieckかなりいい –

関連する問題