2017-09-08 2 views
1

J'essaie de simplifier un grand ensemble de données (52k + lignes) en trouvant la valeur maximale pour chaque intervalle de deux semaines. J'ai déjà affecté des valeurs de numéro de semaine à chaque ligne et utilisé la fonction aggregate() pour trouver la valeur maximale pour chaque semaine.Agréger les paires impaires/paires

données exemple simplifié:

week <- c(1:5, 5, 7:10) 
conc <- rnorm(mean=50, sd=20, n=10) 
df <- data.frame(week,conc) 

aggregate(df, by=list(week), FUN=max) 

Cependant, je suis coincé sur la façon de poursuivre sur la base globale des intervalles de deux semaines (ex: semaines 1 & 2, 3 semaines & 4 ...). Ce n'est pas aussi simple que de combiner tous les autres rangs puisque chaque semaine a été échantillonnée.

Je suppose qu'il y a une solution simple, je ne l'ai pas encore trouvé.

Merci!

+0

Juste a montré celui-ci à une autre requête SO. Essayez 'tapply (df $ conc, rep (1: (nrow (df)/2), chacun = 2), FUN = somme)' – Sagar

+1

Que devrait-il se passer à la semaine 5? La valeur de la semaine 5 doit-elle être retournée? N/A? –

+0

Sagar: Il semble toujours que les paires seraient éliminées s'il y avait une semaine manquante. À moins que j'interprète mal votre code ... – keta

Répondre

1
week <- c(1:5, 5, 7:10) 

bi_week <- (week+1)%/%2 

conc <- rnorm(mean=50, sd=20, n=10) 

df <- data.frame(week,bi_week,conc) 

aggregate(df, by=list(bi_week), FUN=max) 
0
library(purrr) 
library(dplyr) 

Odds<-seq(1:max(week),2) 
Evens<-seq(2,max(week),2) 

map2(.x=Odds,.y=Evens, .f=function(x,y) {df %>% 
filter(week==x | week==y) %>% select(conc) %>% max}) 

J'ai d'abord créé des vecteurs de cotes et nombres pairs. Ensuite, en utilisant le paquet purrr j'ai alimenté ces paires (1 & 2, puis 3 & 4 etc) dans une fonction qui utilise le paquet dplyr pour obtenir juste les bonnes semaines, sélectionnez les valeurs conc et prenez le maximum.

Voici la sortie:

> map2(.x=Odds,.y=Evens, .f=function(x,y) {df %>% filter(week==x | week==y) %>% select(conc) %>% max}) 
[[1]] 
[1] 68.38759 

[[2]] 
[1] 56.9231 

[[3]] 
[1] 77.23965 

[[4]] 
[1] 49.39443 

[[5]] 
[1] 49.38465 

Note: vous pouvez utiliser map2_dbl en place de map2 et obtenir un vecteur numérique au lieu

Edit: suppression de la partie sur df2 comme ce fut une erreur.

0

Utilisez pracma::ceil pour saisir chaque paire bi-hebdomadaire

library(pracma) 
aggregate(df, by=list(ceil(df$week/2)), FUN=max) 

Sortie

Group.1 week  conc 
1  1 2 76.09191 
2  2 4 50.20154 
3  3 5 54.93041 
4  4 8 69.17820 
5  5 10 74.67518 

ceil(df$week/2) 
# 1 1 2 2 3 3 4 4 5 5