从面板格式到宽格式再回到R data.table:如何保留变量名?

从面板格式到宽格式再回到R data.table:如何保留变量名?,r,data.table,reshape,R,Data.table,Reshape,我有一个面板数据集,包含大量的时间段和单位,以及我观察到的每个时间段和单位的大量变量 因为我想对每个单位和变量应用单变量时间序列操作,所以我必须将面板数据转换为宽格式(使用data.table::dcast),以便每列现在显示一个给定单位的变量 应用时间序列观察后,我想回到“长”面板格式(使用data.table::melt),但是,在这里,我丢失了有关单元名称和变量的信息。由于data.table相当大,我担心在这里混淆数据,这就是为什么我希望找到一个保留变量和值名的melt操作 考虑以下示例

我有一个面板数据集,包含大量的时间段和单位,以及我观察到的每个时间段和单位的大量变量

因为我想对每个单位和变量应用单变量时间序列操作,所以我必须将面板数据转换为宽格式(使用data.table::dcast),以便每列现在显示一个给定单位的变量

应用时间序列观察后,我想回到“长”面板格式(使用data.table::melt),但是,在这里,我丢失了有关单元名称和变量的信息。由于data.table相当大,我担心在这里混淆数据,这就是为什么我希望找到一个保留变量和值名的melt操作

考虑以下示例面板数据集:

require(data.table)

日期通过
?melt
读取,我看不出如何直接使用
melt.data.table
执行此操作。但是,您可以从以下位置使用
pivot\u longer()

库(data.table)
日期2:2007-03-01 A1 0.1106000 0.3750282
#>3:2007-04-01 A1 0.6356700 0.9601759
#>4:2007-02-01 B2 0.9821609 0.1782534
#>5:2007-03-01 B2 0.4786173 0.1557481
#>6:2007-04-01 B2 0.7720111 0.7982246
变量名称1:2007-02-01 0.6453802 0.9821609 0.4641508 0.1782534
#> 2: 2007-03-01  0.1106000  0.4786173  0.3750282  0.1557481
#> 3: 2007-04-01  0.6356700  0.7720111  0.9601759  0.7982246
library(tidyr)#devtools::install_github(“tidyverse/tidyr”)
再长一点(
数据=DT_长,
cols=以(“字符串”)开头,
名称\u sep=“\u”,
name_to=c(“.value”,“idx”)
)
#>#tibble:6 x 4
#>时间idx String1 String2
#>              
#>1 2007-02-01 A1 0.645 0.464
#>2 2007-02-01 B2 0.982 0.178
#>3 2007-03-01 A1 0.111 0.375
#>4 2007-03-01 B2 0.479 0.156
#>5 2007-04-01 A1 0.636 0.960
#>6 2007-04-01 B2 0.772 0.798

由(v0.3.0)创建于2019-09-09,您是否可以编辑您的帖子,以包含最少的样本数据和匹配的预期输出(考虑是否真的有必要拥有600行
数据。表
)。另外,
DT
看起来已经是宽幅格式了(一个长表将包含
String1
String2
String3
列中
列中的值)。因此,您不是说“我正在将此面板数据集转换为宽格式”而是说“将此面板数据集转换为长格式”?您知道
value.name
中的参数
melt()
?是的,value.name解决了“value”问题,但没有解决idx问题。我正在调整我的问题,谢谢@sindri_baldur@对我来说,时间单位面板格式是处理这些数据的正确方式,我需要将其转换为宽格式,如我的示例中所示。我发现它可能不是大多数人使用的长格式的定义,所以我用面板格式来代替它。然而,我并不认为这真的改变了我提出问题的方式。@Florestan长宽数据的定义现在已经相当标准化了(但甚至是)。主要问题是您的示例数据非常笨拙。我认为没有必要用600行
data.table
来说明你的观点。如果你能让人们更容易地帮助你,你就更有可能得到快速、良好的回应。毕竟,你是在请求他人帮助你解决问题。谢谢,非常有用的评论并解决了问题!(如果有人有其他想法,我仍然会对非开发版本感兴趣,因为在我的工作场所,不鼓励使用开发版本)
variable_names <- names(DT[,-c("time", "idx")])

DT_long <- dcast(DT, time ~ idx, value.var = variable_names)
DT_long <- DT_long[,-(5:10)]


DT_wide <- melt(DT_long, measure = patterns("^String1", "^String2", "^String3"), value.name = variable_names, variable.name = "idx)

           time idx   String1   String2    String3
  1: 2007-02-01   1 0.9794707 0.5290352 0.68009050
  2: 2007-03-01   1 0.4016173 0.9229200 0.38652407
  3: 2007-04-01   1 0.9475505 0.5956701 0.24686007
  4: 2007-05-01   1 0.6465847 0.8233340 0.08008369
  5: 2007-06-01   1 0.5704834 0.8232598 0.85790038
 ---                                              
596: 2011-09-01  10        NA 0.5525413 0.79994190
597: 2011-10-01  10        NA 0.3895864 0.41347910
598: 2011-11-01  10        NA 0.3123646 0.44461146
599: 2011-12-01  10        NA 0.2148686 0.37609448
600: 2012-01-01  10        NA 0.7314114 0.47138012