2015-03-03 1 views
0

Je veux trier les valeurs d'une colonne data.frame dans des classes prédéterminées, puis additionner des valeurs qui se trouvent dans les mêmes lignes, mais dans une colonne différente.Qu'est-ce que j'essaie de faire est de trier les éléments de colonne de données dans des chutiers en fonction d'une valeur, puis obtenir la somme d'une seconde valeur attachée aux éléments pour tous les éléments de la corbeille. Est-ce que quelqu'un peut m'aider?Comment collecter des données de ligne supplémentaires sur les données classées dans R

Mes données ressemble à ce

df = 

Item    valueX  valueY  
A     169849631  0.9086560 
B     27612064  0.9298379 
C     196651878  1.6516654 
D     33007984  1.3397873 
E     23019448  -0.2954385 
F     54779712  -1.6888178 

Mes bacs ressemble à ceci

Bins= 
start    end 
    1    249982 
249983    499963 
499964    749945 
749946    999926 
999927    1249907 
1249908    1499889 

Ce que je veux une trame de données qui ressemble à ceci (les valeurs hypothétiques en fréquence et colonnes sumvalueY)

resultsdf= 
    binstart    binend  frequency  sumvalueY 
      1    249982    0    0 
    249983    499963    5    200 
    499964    749945    6    400 
    749946    999926    0    0 
    999927    1249907   12    30 
    1249908    1499889    0    0 

Voici mon code (itération en cours)

Start = Bins[,1] 

End = Bins[,2] 

myfunction <- function(Start,End) { 
    sum(df$valueX >= Start & df$valueX < End, df[,2])} 

Binssorted = mapply(myfunction, Start,End) 

Répondre

0

Il y a un certain nombre de façons de le faire. En voici un utilisant le paquet dplyr. J'ai créé quelques fausses données pour l'illustration.

library(dplyr) 

# Fake data 
set.seed(5) # For reproducibility 
dat = data.frame(valueX = runif(1000, 1, 2e6), valueY = rnorm(1000)) 

Nous allons maintenant bin les données et résumer en utilisant l'opérateur de tuyau %>% qui nous permet de fonctions de la chaîne l'un après l'autre, afin que nous puissions effectuer toutes les opérations en une seule fois.

dat %>% 
    # Bin the data 
    mutate(bins = cut(valueX, seq(0, 2e6, 250000))) %>% 
    # Group data into the bins we just created 
    group_by(bins) %>% 
    # Count the number of rows in each bin and sum all the Y values in each bin 
    summarise(freq = n(), 
      sumY = sum(valueY)) 

       bins freq  sumY 
1  (0,2.5e+05] 127 8.404150 
2 (2.5e+05,5e+05] 127 14.988207 
3 (5e+05,7.5e+05] 121 10.750580 
4 (7.5e+05,1e+06] 134 -28.725949 
5 (1e+06,1.25e+06] 106 17.377665 
6 (1.25e+06,1.5e+06] 126 14.340313 
7 (1.5e+06,1.75e+06] 119 -4.241991 
8 (1.75e+06,2e+06] 140 9.312233 
+0

Cela a fonctionné parfaitement. Merci beaucoup pour la suggestion. J'utiliserai certainement dplyr et%>% dans le futur. C'est un opérateur très utile. – trenlo