【问题标题】:Reshape date columns in R重塑 R 中的日期列
【发布时间】:2013-07-11 22:42:19
【问题描述】:

我正在尝试在 R 中将数据从宽格式重塑为长格式。在宽格式中,我的列是日期,我想将这些日期放入行中。我的数据是

structure(list(A = c(1L, 4L, 3L), B = structure(c(1L, 3L, 2L), .Label = c("Site1", 
"Site2", "Site3"), class = "factor"), C = c(1L, 4L, 3L), D = c(7L, 
5L, 1L), X4.5.2013 = c(4L, 6L, 8L), X7.5.2013 = c(2L, 5L, 7L), 
X10.5.2013 = c(5L, 4L, 8L)), .Names = c("A", "B", "C", "D", 
"X4.5.2013", "X7.5.2013", "X10.5.2013"), class = "data.frame", row.names = c(NA, 
-3L))

它给出了这个数据框

  A     B C D X4.5.2013 X7.5.2013 X10.5.2013
1 1 Site1 1 7         4         2          5
2 4 Site3 4 5         6         5          4
3 3 Site2 3 1         8         7          8

请注意,此处的列是日期,因此例如 X4.5.2013 对应于日期 4/5/2013。我想重塑这些数据看起来像

structure(list(A = c(1L, 1L, 1L, 4L, 4L, 4L, 3L, 3L, 3L), B = structure(c(1L, 
1L, 1L, 3L, 3L, 3L, 2L, 2L, 2L), .Label = c("Site1", "Site2", 
"Site3"), class = "factor"), C = c(1L, 1L, 1L, 4L, 4L, 4L, 3L, 
3L, 3L), D = c(7L, 7L, 7L, 5L, 5L, 5L, 1L, 1L, 1L), Date = structure(c(2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L), .Label = c("10/5/2013", "4/5/2013", 
"7/5/2013"), class = "factor"), E = c(4L, 2L, 5L, 6L, 5L, 4L, 
8L, 7L, 8L)), .Names = c("A", "B", "C", "D", "Date", "E"), class = "data.frame", row.names = c(NA, 
 -9L))

  A     B C D      Date E
1 1 Site1 1 7  4/5/2013 4
2 1 Site1 1 7  7/5/2013 2
3 1 Site1 1 7 10/5/2013 5
4 4 Site3 4 5  4/5/2013 6
5 4 Site3 4 5  7/5/2013 5
6 4 Site3 4 5 10/5/2013 4
7 3 Site2 3 1  4/5/2013 8
8 3 Site2 3 1  7/5/2013 7
9 3 Site2 3 1 10/5/2013 8

我一直在网上阅读,似乎我想使用“reshape”命令。这个我试过了

reshape(df1, varying = list(c("X4.5.2013", "X7.5.2013", "X10.5.2013")),
             idvar = "D", direction = "long")

导致

    A     B C D time X4.5.2013
7.1 1 Site1 1 7    1         4
5.1 4 Site3 4 5    1         6
1.1 3 Site2 3 1    1         8
7.2 1 Site1 1 7    2         2
5.2 4 Site3 4 5    2         5
1.2 3 Site2 3 1    2         7
7.3 1 Site1 1 7    3         5
5.3 4 Site3 4 5    3         4
1.3 3 Site2 3 1    3         8

这似乎有点工作,但是当我希望这些时间成为原始数据框中列标题的日期时,它给了我一个“时间”列。有谁知道我如何使用这个“时间”列的列标题 - 而是将此列称为“日期”并将列标题转换为日期格式,就像我上面发布的第二个数据框一样?

谢谢!

编辑:玩了一会儿之后,我发现

reshape(df1, varying=list(c("X4.5.2013", "X7.5.2013", "X10.5.2013")), times=names(df1[5:7]), timevar = "Date", idvar="D", direction = "long")

结果

             A     B C D       Date X4.5.2013
7.X4.5.2013  1 Site1 1 7  X4.5.2013         4
5.X4.5.2013  4 Site3 4 5  X4.5.2013         6
1.X4.5.2013  3 Site2 3 1  X4.5.2013         8
7.X7.5.2013  1 Site1 1 7  X7.5.2013         2
5.X7.5.2013  4 Site3 4 5  X7.5.2013         5
1.X7.5.2013  3 Site2 3 1  X7.5.2013         7
7.X10.5.2013 1 Site1 1 7 X10.5.2013         5
5.X10.5.2013 4 Site3 4 5 X10.5.2013         4
1.X10.5.2013 3 Site2 3 1 X10.5.2013         8

这非常接近我想要的,但仍然不完美。以下是我仍然遇到的问题:

1) 如何将最后一列的名称从“X4.5.2013”​​更改为“E”? reshape 命令中有没有办法,或者我必须在整形后使用单独的命令来执行此操作? 2)为什么最后一个数据帧中的索引格式为“7.X4.5.2013”​​(例如)?

【问题讨论】:

  • 另一个想法。 reshape 尝试使用 dashes 或 dots 为列创建名称,因此请尝试设置 sep="" 来防止这种情况。

标签: r


【解决方案1】:

使用time 变量从列名向量中进行选择,其中df2 是您提供的第一个整形命令的结果。

df2$time <- as.Date( 
              sub("X","", c("X4.5.2013", "X7.5.2013", "X10.5.2013"))[
                                                             df2$time], 
                    format="%m.%d.%Y")
df2

    A     B C D       time X4.5.2013
7.1 1 Site1 1 7 2013-04-05         4
5.1 4 Site3 4 5 2013-04-05         6
1.1 3 Site2 3 1 2013-04-05         8
7.2 1 Site1 1 7 2013-07-05         2
5.2 4 Site3 4 5 2013-07-05         5
1.2 3 Site2 3 1 2013-07-05         7
7.3 1 Site1 1 7 2013-10-05         5
5.3 4 Site3 4 5 2013-10-05         4
1.3 3 Site2 3 1 2013-10-05         8

如果您更喜欢处理第二次重塑操作(我将其命名为 df3)的结果,请执行以下操作:

df3$Date <- as.Date( sub("X","", df3$Date) , format="%m.%d.%Y")

【讨论】:

  • 感谢 DWin 的帮助,但这似乎并没有重塑我原始数据框中的数据。我显然没有遵循你的意思,请你再解释一下(我很抱歉没有遵循,但正如你所见,我不太擅长 R)。
  • 我也可以“修复”第二个的结果。
  • 嗨 DWin,我现在明白你的意思了。使用您的第二个建议进行第二次重塑操作似乎是最简单的解决方案。再次感谢!
  • DWin,当我将它应用于我的真实数据时,我收到一个错误“row.names&lt;-.data.frame(*tmp*, value = paste(d[, idvar], times[1L], 中的错误):不允许重复的'row.names'”有什么建议吗?
  • 错误来自reshape 操作。您将需要发布有关数据框的更多信息。列名可能重复?
猜你喜欢
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
相关资源
最近更新 更多