0

I have data like given below

Product_Code  Item
ABC            Apple
ABC            Orange
ABC            Banana
DEF            Orange
DEF            Banana

I want my result as:

Product_Code   Item    New_Item
ABC            Apple   Apple, Orange, Banana
ABC            Orange  Apple, Orange, Banana
ABC            Banana  Apple, Orange, Banana
DEF            Orange  Orange, Banana
DEF            Banana  Orange, Banana

Can you help me how I can do that in R?

Maurits Evers
  • 49,617
  • 4
  • 47
  • 68
Syed
  • 55
  • 4
  • This is for `summarize` but the idea is the same - [Collapse / concatenate / aggregate a column to a single comma separated string within each group](https://stackoverflow.com/questions/15933958/collapse-concatenate-aggregate-a-column-to-a-single-comma-separated-string-w) ; or there's also for `mutate` https://stackoverflow.com/questions/38514988/concatenate-strings-by-group-with-dplyr – arg0naut91 Mar 13 '20 at 11:29

1 Answers1

2

Option 1: Using dplyr

library(dplyr)
df %>%
    group_by(Product_Code) %>%
    mutate(New_Item = toString(Item)) %>%
    ungroup()
## A tibble: 5 x 3
#  Product_Code Item   New_Item
#  <fct>        <fct>  <chr>
#1 ABC          Apple  Apple, Orange, Banana
#2 ABC          Orange Apple, Orange, Banana
#3 ABC          Banana Apple, Orange, Banana
#4 DEF          Orange Orange, Banana
#5 DEF          Banana Orange, Banana

Option 2: In base R

We can use ave

transform(df, New_Item = ave(as.character(Item), Product_Code, FUN = toString))
#  Product_Code   Item              New_Item
#1          ABC  Apple Apple, Orange, Banana
#2          ABC Orange Apple, Orange, Banana
#3          ABC Banana Apple, Orange, Banana
#4          DEF Orange        Orange, Banana
#5          DEF Banana        Orange, Banana

Option 3: Using data.table

library(data.table)
setDT(df)
df[, New_Item := toString(Item), by = Product_Code]
df
#    Product_Code   Item              New_Item
#1:          ABC  Apple Apple, Orange, Banana
#2:          ABC Orange Apple, Orange, Banana
#3:          ABC Banana Apple, Orange, Banana
#4:          DEF Orange        Orange, Banana
#5:          DEF Banana        Orange, Banana

Sample data

df <- read.table(text =
    "Product_Code  Item
ABC            Apple
ABC            Orange
ABC            Banana
DEF            Orange
DEF            Banana", header = T)
Maurits Evers
  • 49,617
  • 4
  • 47
  • 68