2011-07-07 1 views
1

Voici un exemple:sous-ensembles de la R, assemblage et de calcul multiples répétitions

> tmp 
    label value1 value2 
1 aa_x_x xx  xx 
2 bc_x_x xx  xx 
3 aa_x_x xx  xx 
4 bc_x_x xx  xx 

Comment calculer la médiane de toutes les étiquettes répétées (ou plus, des valeurs correspondantes dans les autres colonnes de trame de données), mais en tenant comptez seulement les deux premières lettres (c.-à-d. "aa_1_1" et "aa_s_3" sont les mêmes valeurs)? La liste des étiquettes est finie et utilisable.

J'ai lu aggregate, %in%, subset et substr, mais je suis incapable de compiler quoi que ce soit utile et simple.

Voici ce que je souhaite obtenir:

> tmp.result 
    label median1 some.calculation2 
1 aa  xx  xx 
2 bc  xx  xx 
3 aa  xx  xx 
4 bc  xx  xx 

Merci beaucoup.

Répondre

5

Avez-vous essayé de créer un nouveau bloc de données - je l'appellerai tmp2 --où tmp2$label==substr(tmp$label,0,2)? À partir de là, vous pouvez, par exemple, utiliser tapply(tmp2$value1,tmp2$label,mean) pour obtenir les valeurs moyennes de value1 agrégées sur tmp2$label.

Une option à l'aide dplyr

library(dplyr) 
tmp %>% 
    group_by(label=sub('_.*$', '', label)) %>% 
    transmute(median1=median(value1), mean1=mean(value2)) 

Ou data.table

library(data.table) 
setDT(tmp)[, c('median1', 'mean1') := list(median(value1), 
    mean1= mean(value2)) , .(label=sub('_.*$', '', label))][, c(1,4:5), 
     with=FALSE] 
+0

Merci, Jack. Malheureusement, je ne comprends pas la solution. Btw, j'ai mis à jour la question après votre réponse ... – marw

+0

'tmp2 <-temp; tmp2 $ étiquette <-substr (tmp2 $ label, 0,2); median_value_1 <-tapply (tmp2 $ valeur1, tmp2 $ étiquette, médiane); ' –

+0

+1 pour compenser ma grossièreté ailleurs; P – Mchl

Questions connexes