您好,我有一个每组 3-5 行的数据集,如下所示,我想将一些列设置为更长的格式,并在列中设置更宽的格式。
下面的第一个数据集代表原始格式,我想将其转换为第二个数据集。我已经使用了 Pivot Wide Cols = c("Jan", "Feb") 但我无法同时将 Type 列转得更长。
data <- as.data.frame(matrix(ncol=5, nrow=6))
colnames(data) <- c("names", "group", "Type", "Jan", "Feb")
data$names <- c("P1", "P1", "P1", "P2", "P2", "P2")
data$group <- "S"
data$Type <- c("Beg", "Middle", "End", "Beg", "Middle", "End")
data$Jan <- c(1, 2, 3, 10, 5, 15)
data$Feb <- c(5, 5, 10, 5, 2, 7)
names group Type Jan Feb
1 P1 S Beg 1 5
2 P1 S Middle 2 5
3 P1 S End 3 10
4 P2 S Beg 10 5
5 P2 S Middle 5 2
6 P2 S End 15 7
data_transformed <- as.data.frame(matrix(ncol=6, nrow=4))
colnames(data_transformed) <- c("names", "group", "Month", "Beg", "Middle", "End")
data_transformed$names <- c("P1", "P1", "P2", "P2")
data_transformed$group <- "S"
data_transformed$Month <- c("Jan", "Feb")
data_transformed$Beg <- c(1, 10, 5, 5)
data_transformed$Middle <- c(2, 5, 5, 2)
data_transformed$End <- c(2, 15, 10, 7)
names group Month Beg Middle End
1 P1 S Jan 1 2 2
2 P1 S Feb 10 5 15
3 P2 S Jan 5 5 10
4 P2 S Feb 5 2 7
这里,我们需要一个
pivot_longer
+ pivot_wider
,即首先使用 col
s Jan
重塑为“长”为“二月”,然后使用“类型”中的列名称将长形重塑为更宽的格式
library(dplyr)
library(tidyr)
data %>%
pivot_longer(cols = Jan:Feb, names_to = 'Month') %>%
pivot_wider(names_from = Type, values_from = value)
-输出
# A tibble: 4 x 6
# names group Month Beg Middle End
# <chr> <chr> <chr> <dbl> <dbl> <dbl>
#1 P1 S Jan 1 2 3
#2 P1 S Feb 5 5 10
#3 P2 S Jan 10 5 15
#4 P2 S Feb 5 2 7
或使用
recast
中的
reshape2
library(reshape2)
recast(data, measure = c("Jan", "Feb"),
names + group + variable ~ Type, values.var = 'value')
使用
data.table
+ dcast
的
melt
选项
dcast(
melt(
setDT(data),
id.vars = c("names", "group", "Type"),
variable.name = "Month"
),
names + group + Month ~ Type
)
给予
names group Month Beg End Middle
1: P1 S Jan 1 3 2
2: P1 S Feb 5 10 5
3: P2 S Jan 10 15 5
4: P2 S Feb 5 7 2
这已经晚了几年,但是 procs 包中的
proc_transpose
(当时 CRAN 上可能不存在)可以按组转置。下面的代码指定要分组的列 (by=
)、id 列 (id=
)(将成为输出数据框中的列名称的列)以及新列的列名称 (name=
)在保存输入中的列名称的输出中。其余列按组转置。如果默认的NAME
就可以的话,name=参数可以省略。
library(procs)
proc_transpose(data, id = "Type", by = c("names", "group"), name = "Month")
## names group Month Beg Middle End
## 1 P1 S Jan 1 2 3
## 2 P1 S Feb 5 5 10
## 3 P2 S Jan 10 5 15
## 4 P2 S Feb 5 2 7