问题描述
我正在尝试将多个长数据集 (read_csv
) 转换为宽数据。原始样本数据如下:
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
我想要以下内容:
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
有没有办法通过 pivot_wider
、dcast
和/或 melt
实现这一目标?我也对 gather()
和 spread()
持开放态度。
解决方法
我们可以使用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))
-输出
# 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"),CATEGORY = c("Low","Med","Low","Med"),NUMBER_CATEGORY = c(180L,185L,118L,182L,185L)),class = "data.frame",row.names = c(NA,-5L))
,
在基础 R 中,您可以:
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