R pivot_wider 或 dcast 来投射多列 数据

问题描述

我正在尝试将多个长数据集 (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_widerdcast 和/或 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