【问题标题】:Reshape large dataset from wide to long with two ID variables使用两个 ID 变量从宽到长重塑大型数据集
【发布时间】: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 次迭代)进行了一些快速测试,并且差异很小与您的测试数据。

标签: r reshape reshape2


【解决方案1】:

data.table 通常更快,您可以尝试从中使用dcast

library(data.table)
dcast(setDT(df), ID1+ID2~Timepoint, value.var = c('Date', 'V1'))

正如@Mark Davies 所建议的,pivot_wider 也可以提供帮助。

tidyr::pivot_wider(df, names_from = Timepoint, values_from = c(Date, V1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-15
    • 2018-02-17
    • 2015-11-05
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多