简体   繁体   中英

R pivot_wider or dcast to cast multiple columns

I am trying to cast multiple long dataset ( read_csv ) into wide data. The original sample data is the following:

ClassData <- read_csv("H:/Name Data.csv")

NAME    CATEGORY    NUMBER_CATEGORY
Amy     Low         180
Amy     Med         185
John    Low         118
John    Med         182
John    Med         185

I want the following:

NAME    CATEGORY 1  NUMBER_CATEGORY 1   CATEGORY 2  NUMBER_CATEGORY 2   CATEGORY 3  NUMBER_CATEGORY 3
Amy Low 180 Med 185 NULL    NULL
John    Low 118 Med 182 Med 185

Is there a way to achieve this with pivot_wider , dcast and/or melt ? I am open to gather() and spread() as well.

We can use pivot_wider

library(dplyr)
library(tidyr)
library(data.table)
df1 %>%
   mutate(rn = rowid(NAME)) %>%
   pivot_wider(names_from = rn, values_from = c(CATEGORY, NUMBER_CATEGORY))

-output

# A tibble: 2 x 7
#  NAME  CATEGORY_1 CATEGORY_2 CATEGORY_3 NUMBER_CATEGORY_1 NUMBER_CATEGORY_2 NUMBER_CATEGORY_3
#  <chr> <chr>      <chr>      <chr>                  <int>             <int>             <int>
#1 Amy   Low        Med        <NA>                     180               185                NA
#2 John  Low        Med        Med                      118               182               185

data

df1 <- structure(list(NAME = c("Amy", "Amy", "John", "John", "John"), 
    CATEGORY = c("Low", "Med", "Low", "Med", "Med"), NUMBER_CATEGORY = c(180L, 
    185L, 118L, 182L, 185L)), class = "data.frame", row.names = c(NA, 
-5L))

In base R, you could do:

reshape(transform(df, time = ave(NAME, NAME, FUN = seq)), 
        v.names = c("CATEGORY", "NUMBER_CATEGORY"), dir="wide", idvar = "NAME", sep = "_")

  NAME CATEGORY_1 NUMBER_CATEGORY_1 CATEGORY_2 NUMBER_CATEGORY_2 CATEGORY_3 NUMBER_CATEGORY_3
1  Amy        Low               180        Med               185       <NA>                NA
3 John        Low               118        Med               182        Med               185

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM