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