2015-12-20 17 views
5

Próbuję utworzyć "fale" zmiennych reprezentujących powtarzające się pomiary. W szczególności próbuję utworzyć kolejne zmienne, które reprezentują wartości średnie dla zmiennych 1 - 10, 11 - 20 ... 91-100. Zwróć uwagę, że "..." symbolizuje zmienne dla fal od 3 do 9, ponieważ unikanie pisania jest moim celem!Mutacja wielu/kolejnych kolumn (z dplyr lub podstawą R)

Oto przykład ramka danych, df, z 10 wierszy i 100 kolumn:

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

Użyłem dplyrmutate funkcję, która działa, gdy wszystkie zmienne są wpisane, ale jest czasochłonne i skłonny do błędów. Nie udało się znaleźć sposób, aby to zrobić bez uciekania się do ręcznego wpisywania nazwy kolumn, jak zacząłem robić poniżej (należy pamiętać, że „...” symbolizuje fale od 3 do 9):

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) 

Czy możesz mutate mutować wiele/kolejne kolumny z "dplyr"? Inne podejścia również są mile widziane.

+1

Czy to musi być z dplyr? –

+0

Nie, dziękuję - inne rozwiązanie byłoby wspaniałe, –

Odpowiedz

5

tutaj jedną z pakietem zoo:

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

Oto jeden sposób to zasady R:

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 

Innym bardzo zwięzły sposób z zasady R (dzięki uprzejmości G. Grothendieck):

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

i tu jest rozwiązanie z dplyr i tidyr:

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

Dzięki, poczekam, aby sprawdzić, czy ktoś ma odpowiedź za pomocą dplyr, jeśli to w porządku, –

+1

@ JoshuyRosenberg na pewno, nie trzeba się spieszyć –

+0

@ G.Grothendieck całkiem ładny –

Powiązane problemy