1
votes

Transposer et additionner des valeurs distinctes dans R

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

r

0 commentaires

3 Réponses :


0
votes

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'
)


0 commentaires

0
votes

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


0 commentaires

0
votes

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

Remarque

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))  


0 commentaires