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”,因此您要在该包中寻找的功能是 recastrecast 函数基本上是一个 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”或其他替代方案。