【发布时间】:2021-08-17 09:53:36
【问题描述】:
我想使用两个 ID 变量将我的数据从长格式更改为宽格式。
我有下面的代码可以与下面的示例数据集一起使用。但是,当我使用我正在使用的更大数据集运行此代码时,代码运行了很长时间并且似乎没有完成运行。当我使用一个 ID 变量时,代码运行良好,但我需要包含两个。
有没有更有效的方式将长格式转换为宽格式?
(我也考虑过基于 ID1 和 ID2 创建一个 ID 变量,用于从长转换为宽。也许这是最好的解决方案?)
Wide.vars <- names(df[,c("Date","V1")])
### 1. Reshape from wide to long format with two ID variables
df_wide <- reshape(as.data.frame(df),
idvar = c("ID1","ID2"),
direction = "wide",
v.names = Wide.vars,
timevar = "Timepoint")
下面的示例数据(请注意,示例数据集的维度是 15 行 5 列,而我正在使用的数据集是 15658 行 x 99 列)。
df <- structure(list(ID1 = c(5643923L, 5643923L, 5643923L, 3914822L,
3914822L, 3914822L, 3914822L, 1156115L, 1506426L, 7183921L, 4753447L,
4606792L, 8492773L, 8492773L, 8492773L), ID2 = c("02179",
"02179", "04101", "00819", "00819", "00819", "00819",
"01904", "01127", "00475", "02084", "04118", "15553",
"15553", "15553"), Date = structure(c(16731, 16731,
16731, 16732, 16733, 16733, 16733, 16733, 16733, 16733, 16733,
16733, 16734, 16734, 16734), class = "Date"), Timepoint = structure(c(1L,
3L, 1L, 1L, 3L, 4L, 5L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 4L), .Label = c("baseline",
"wave0.5", "wave1", "wave2", "wave3", "wave4"), class = "factor"), V1 = c(0, 8, 4, 9.5, 7, 7, 12, 9, 11, 8.4,
7.8, 6.6, 5, 5.5, 8.9)), row.names = c(NA,
-15L), groups = structure(list(CP1_t_210 = structure(1L, .Label = c("baseline",
"wave0.5", "wave1", "wave2", "wave3", "wave4"), class = "factor"),
.rows = structure(list(1:15), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, -1L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
【问题讨论】:
-
你考虑过
tidyr::pivot_wider吗? -
我认为问题在于您的宽格式列太多:我已经按照您的建议使用一个 id 以及 data.table(1000 次迭代)进行了一些快速测试,并且差异很小与您的测试数据。