2015-05-20 17 views
8

ho un frame di dati con 2 colonne e 3659 righe dfCalcolare la media di ogni 13 righe nella cornice dati

sto cercando di ridurre il set di dati dalla media ogni 10 o 13 righe in questo frame di dati, così ho provato la seguente:

# number of rows per group 
n=13 
# number of groups 
n_grp=nrow(df)/n 
round(n_grp,0) 
# row indices (one vector per group) 
idx_grp <- split(seq(df), rep(seq(n_grp), each = n)) 

# calculate the col means for all groups 
res <- lapply(idx_grp, function(i) { 
    # subset of the data frame 
    tmp <- dat[i] 
    # calculate row means 
    colMeans(tmp, na.rm = TRUE) 
}) 
# transform list into a data frame 
dat2 <- as.data.frame(res) 

Tuttavia, non è possibile dividere il numero di righe da 10 o 13 perché la lunghezza dei dati non è un multiplo di variabile di distinzione. Quindi io non sono sicuro che cosa dovrebbe fare allora (voglio solo può essere quella di calcolare la media dell'ultimo gruppo -anche con meno di 10 elementi)

Ho provato anche questo, ma i risultati sono gli stessi:

df1=split(df, sample(rep(1:301, 10))) 
+0

Qualcuno ha fatto una domanda simile oggi. Combina 'split' e' cut'. Vedi se questo aiuta http://stackoverflow.com/questions/30356275/r-divide-data-into-groups –

+0

il problema che non posso dividere per il numero di gruppi che voglio. perché ho un numero dispari di colonne e voglio avere 10 gruppi per esempio – user3617715

risposta

9

Ecco una soluzione che utilizza aggregate() e rep().

df <- data.frame(a=1:12, b=13:24); 
df; 
##  a b 
## 1 1 13 
## 2 2 14 
## 3 3 15 
## 4 4 16 
## 5 5 17 
## 6 6 18 
## 7 7 19 
## 8 8 20 
## 9 9 21 
## 10 10 22 
## 11 11 23 
## 12 12 24 
n <- 5; 
aggregate(df,list(rep(1:(nrow(df)%/%n+1),each=n,len=nrow(df))),mean)[-1]; 
##  a b 
## 1 3.0 15.0 
## 2 8.0 20.0 
## 3 11.5 23.5 

La parte importante di questa soluzione che gestisce la questione della non-divisibilità di nrow(df) da n è specificando il parametro len (in realtà il nome completo del parametro è length.out) di rep(), che ricopre automaticamente il vettore gruppo al lunghezza appropriata

6

Se df è un data.table, è possibile utilizzare %/% al gruppo come in

library(data.table) 
setDT(df) 
n <- 13 # every 13 rows 

df[, mean(z), by= (seq(nrow(df)) - 1) %/% n] 

se invece si desidera che ogni ennesima riga, utilizzare %% invece di %/%

df[, mean(z), by= (seq(nrow(df)) - 1) %% n] 
5

Questo dovrebbe funzionare. Usa n = 13 per raggruppare 13 file insieme. Se hai 27 righe, riceverai gruppi di dimensioni 13, 13, 1.

n.colmeans = function(df, n = 10){ 
    aggregate(x = df, 
       by = list(gl(ceiling(nrow(df)/n), n)[1:nrow(df)]), 
       FUN = mean) 
} 

n.colmeans(state.x77, 10) 

    Group.1 Population Income Illiteracy Life Exp Murder HS Grad Frost  Area 
1  1  4892.8 4690.8  1.44 70.508 9.53 53.63 75.1 116163.6 
2  2  3570.5 4419.4  1.12 71.110 7.07 53.35 99.8 44406.6 
3  3  3697.9 4505.5  0.93 70.855 6.64 55.25 131.7 60873.0 
4  4  5663.9 4331.2  1.33 70.752 7.12 49.59 103.6 56949.5 
5  5  3407.0 4232.1  1.03 71.168 6.53 53.72 112.1 75286.7 
Problemi correlati