reshape2 是否具有 casetovars 等价物?
Does reshape2 have casetovars equivalent?
我有:数据table:
Id
Time
v1
v2
v3
T1
2
1
2
T2
3
1
2
T3
1
3
3
基本上,我有三个波(T1、T2)等的数据。我需要将其设为宽格式,因此它看起来像这样:
id
v1T1
v2T1
v3T1
v1T2
v2T2
v3T2
v1T3
V2T3
2
1
2
3
1
2
1
3
我试过以下代码:
data %>%
group_by(id) %>%
mutate(id=paste0("id", row_number())) %>%
spread(id, v1, v2, v3)
我错过了什么?我知道如何在 SPSS 中使用 casetovars 执行此操作,但我无法在 R 中复制它。
您可以使用 pivot_wider
:
tidyr::pivot_wider(df, names_from = Time, values_from = v1:v3)
# Id v1_T1 v1_T2 v1_T3 v2_T1 v2_T2 v2_T3 v3_T1 v3_T2 v3_T3
# <dbl> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#1 1 2 3 1 1 1 3 2 2 3
或使用data.table
:
library(data.table)
dcast(setDT(df), Id~Time, value.var = c('v1', 'v2', 'v3'))
数据
df <- structure(list(Id = c(1, 1, 1), Time = c("T1", "T2", "T3"), v1 = c(2L,
3L, 1L), v2 = c(1L, 1L, 3L), v3 = c(2L, 2L, 3L)), row.names = c(NA,
-3L), class = "data.frame")
由于您的问题标题提到“reshape2”,因此您要在该包中寻找的功能是 recast
。 recast
函数基本上是一个 melt
后跟一个 dcast
,在 reshape2::dcast
中需要它来转换多个值变量(但在 data.table::dcast
中不需要,它可以接受值变量向量,如 Ronak's answer).
中所示
这是它的样子:
library(reshape2)
recast(df, ... ~ variable + Time, id.var=1:2)
## Id v1_T1 v1_T2 v1_T3 v2_T1 v2_T2 v2_T3 v3_T1 v3_T2 v3_T3
## 1 1 2 3 1 1 1 3 2 2 3
作为参考,您也可以使用来自基数 R 的 reshape
执行此操作:
reshape(df, direction = "wide", idvar = "Id", timevar = "Time")
## Id v1.T1 v2.T1 v3.T1 v1.T2 v2.T2 v3.T2 v1.T3 v2.T3 v3.T3
## 1 1 2 1 2 3 1 2 1 3 3
也就是说,很多人发现 reshape
很难学,虽然“reshape2”包将得到维护,但不会积极开发。因此,虽然您可以预期不会出现问题,但不会向其中添加新功能。为此,您必须查看“data.table”实现或开始使用“tidyr”或其他替代方案。
我有:数据table:
Id | Time | v1 | v2 | v3 |
---|---|---|---|---|
T1 | 2 | 1 | 2 | |
T2 | 3 | 1 | 2 | |
T3 | 1 | 3 | 3 |
基本上,我有三个波(T1、T2)等的数据。我需要将其设为宽格式,因此它看起来像这样:
id | v1T1 | v2T1 | v3T1 | v1T2 | v2T2 | v3T2 | v1T3 | V2T3 |
---|---|---|---|---|---|---|---|---|
2 | 1 | 2 | 3 | 1 | 2 | 1 | 3 |
我试过以下代码:
data %>%
group_by(id) %>%
mutate(id=paste0("id", row_number())) %>%
spread(id, v1, v2, v3)
我错过了什么?我知道如何在 SPSS 中使用 casetovars 执行此操作,但我无法在 R 中复制它。
您可以使用 pivot_wider
:
tidyr::pivot_wider(df, names_from = Time, values_from = v1:v3)
# Id v1_T1 v1_T2 v1_T3 v2_T1 v2_T2 v2_T3 v3_T1 v3_T2 v3_T3
# <dbl> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#1 1 2 3 1 1 1 3 2 2 3
或使用data.table
:
library(data.table)
dcast(setDT(df), Id~Time, value.var = c('v1', 'v2', 'v3'))
数据
df <- structure(list(Id = c(1, 1, 1), Time = c("T1", "T2", "T3"), v1 = c(2L,
3L, 1L), v2 = c(1L, 1L, 3L), v3 = c(2L, 2L, 3L)), row.names = c(NA,
-3L), class = "data.frame")
由于您的问题标题提到“reshape2”,因此您要在该包中寻找的功能是 recast
。 recast
函数基本上是一个 melt
后跟一个 dcast
,在 reshape2::dcast
中需要它来转换多个值变量(但在 data.table::dcast
中不需要,它可以接受值变量向量,如 Ronak's answer).
这是它的样子:
library(reshape2)
recast(df, ... ~ variable + Time, id.var=1:2)
## Id v1_T1 v1_T2 v1_T3 v2_T1 v2_T2 v2_T3 v3_T1 v3_T2 v3_T3
## 1 1 2 3 1 1 1 3 2 2 3
作为参考,您也可以使用来自基数 R 的 reshape
执行此操作:
reshape(df, direction = "wide", idvar = "Id", timevar = "Time")
## Id v1.T1 v2.T1 v3.T1 v1.T2 v2.T2 v3.T2 v1.T3 v2.T3 v3.T3
## 1 1 2 1 2 3 1 2 1 3 3
也就是说,很多人发现 reshape
很难学,虽然“reshape2”包将得到维护,但不会积极开发。因此,虽然您可以预期不会出现问题,但不会向其中添加新功能。为此,您必须查看“data.table”实现或开始使用“tidyr”或其他替代方案。