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