2016-06-16 3 views
2

J'essaie d'utiliser la fonction d'agrégat dans R où je veux que la dimension de la trame de données de sortie reste inchangée. Par exemple: Disons que j'ai la trame de données suivanteAgréger sans réduire la dimension de la trame

Name------Type------ Price 
Prod1-----A--------  $1 
Prod2----A---------  $5 
Prod3----B----------  $7 
Prod4-----B---------  $9 

Après avoir utilisé la fonction d'agrégat dans R en regroupant sur le type et fonction Somme des prix. J'obtiens le résultat suivant:

Type-------Value 
A-----------6 
B-----------16 

Cependant, je veux que la dimension de la trame de données reste la même. Par exemple:

Name-----Type----Price----Value 
Prod1----A-------$1-------$6 
Prod2----A-------$5--------$6 
Prod3----B--------$7-------$16 
Prod 4----B-------$9--------$16 

Je ne souhaite pas utiliser Boucle pour cette application. Veuillez suggérer n'importe quelle autre manière de faire ceci.

+0

Pourquoi avez-vous unaccepted ma solution (ce qui est exactement le résultat attendu Tu as montré)? Si vous aviez montré sans le signe «$», je l'aurais fait. C'est trop. – akrun

Répondre

2

En utilisant dplyr,

library(dplyr) 
df %>% 
    group_by(Type) %>% 
    mutate(Value = sum(Price)) 

ou en utilisant data.table,

library(data.table) 
setDT(df)[, Value := sum(Price), by = Type] 

# Name Type Price Value 
#1: P1 A  1  6 
#2: P1 A  5  6 
#3: P3 B  7 16 
#4: P4 B  9 16 
5

Nous pouvons utiliser ave de base R

df1$Value <- with(df1, paste0("$", ave(as.numeric(sub("[$]", "", Price)), 
          Type, FUN = sum))) 
df1$Value 
#[1] "$6" "$6" "$16" "$16"