R pivot_wider 或 dcast 来投射多列

时间:2021-05-06 16:42:17

标签: r pivot reshape

我正在尝试将多个长数据集 (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() 持开放态度。

2 个答案:

答案 0 :(得分:0)

我们可以使用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", "John"), 
    CATEGORY = c("Low", "Med", "Low", "Med", "Med"), NUMBER_CATEGORY = c(180L, 
    185L, 118L, 182L, 185L)), class = "data.frame", row.names = c(NA, 
-5L))

答案 1 :(得分:0)

在基础 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