Y a-t-il un moyen de transposer et de sommer des valeurs distinctes dans R Par exemple
Cola Order Quantity LocA_Quantity Loc B_Quantity ABC 2 8 4 4 CSD 4 6 6 CDS 3 2 2
Nous avons les mêmes valeurs pour la commande et la quantité, mais nous devons encore en faire la somme.
Résultat attendu (Transposer par rapport à la quantité)
df Cola Order Quantity Loc ABC 1 4 LocA ABC 1 4 LocB CSD 4 6 LocA CDS 3 2 LocB
3 Réponses :
Créez l'ensemble de données:
library(dplyr)
df %>%
group_by(Cola) %>%
summarise(
Order = sum(Order),
LocA_Quantity = sum(Quantity * if_else(Loc == "LocA", 1, 0)),
LocB_Quantity = sum(Quantity * if_else(Loc == "LocB", 1, 0)),
Quantity = sum(Quantity)
)
Créez les résumés:
library(tibble) df = tribble( ~Cola, ~Order, ~Quantity, ~Loc, 'ABC', 1, 4, 'LocA', 'ABC', 1, 4, 'LocB', 'CSD', 4, 6, 'LocA', 'CDS', 3, 2, 'LocB' )
Vous pouvez le faire pour la quantité et la commande et supprimer les colonnes que vous ne voulez pas à la fin, c'est-à-dire
library(tidyverse) df %>% group_by(Cola) %>% mutate_at(vars(2:3), list(new = sum)) %>% pivot_wider(names_from = Loc, values_from = 2:3) ## A tibble: 3 x 7 ## Groups: Cola [3] # Cola Order_new Quantity_new Order_LocA Order_LocB Quantity_LocA Quantity_LocB # <fct> <int> <int> <int> <int> <int> <int> #1 ABC 2 8 1 1 4 4 #2 CSD 4 6 4 NA 6 NA #3 CDS 3 2 NA 3 NA 2
1) dplyr / tidyr En utilisant les données affichées de manière reproductible dans la note à la fin, additionnez les commandes et la quantité et créez une colonne Quantity_ égale à Quantity par Cola . Puis remodelez la colonne Quantity_ en forme large.
Lines <- "Cola Order Quantity Loc ABC 1 4 LocA ABC 1 4 LocB CSD 4 6 LocA CDS 3 2 LocB" df <- read.table(text = Lines, header = TRUE, as.is = TRUE)
donnant:
df2 <- transform(df,
Quantity_ = Quantity,
Quantity = ave(Quantity, Cola, FUN = sum),
Order = ave(Order, Cola, FUN = sum))
wide <- reshape(df2, dir = "wide", idvar = c("Cola", "Quantity", "Order"),
timevar = "Loc", sep = "")
wide
## Cola Order Quantity Quantity_LocA Quantity_LocB
## 1 ABC 2 8 4 4
## 3 CSD 4 6 6 NA
## 4 CDS 3 2 NA 2
2) Base R Nous pouvons faire à peu près la même chose dans la base R en utilisant transform / ave et remodeler comme ceci:
# A tibble: 3 x 5 Cola Order Quantity Quantity_LocA Quantity_LocB <chr> <int> <int> <int> <int> 1 ABC 2 8 4 4 2 CSD 4 6 6 0 3 CDS 3 2 0 2
library(dplyr)
library(tidyr)
df %>%
group_by(Cola) %>%
mutate(Quantity_ = Quantity,
Order = sum(Order),
Quantity = sum(Quantity)) %>%
ungroup %>%
pivot_wider(names_from = "Loc", values_from = "Quantity_",
names_prefix = "Quantity_", values_fill = list(Quantity_ = 0))