【问题标题】:Reshape Panel Data from Long to Wide [duplicate]从长到宽重塑面板数据[重复]
【发布时间】:2014-03-21 12:23:17
【问题描述】:

我想将我的面板数据从长格式转换为宽格式。我知道还有许多其他问题涉及到这个主题,但是,我不相信他们中的任何一个都有我正在寻找的确切答案。

my.df <- data.frame(ID=rep(c("A","B","C"), 3), 
    TIME=rep(1:3, each=3), Price=1:9)
my.df

   ID TIME Price
1   A    1     1
2   B    1     2
3   C    1     3
4   A    2     4
5   B    2     5
6   C    2     6
7   A    3     7
8   B    3     8
9   C    3     9

  TIME Price-A Price-B Price-C
1    1       1       2       3
2    2       4       5       6
3    3       7       8       9

感谢您提供的任何帮助!弗朗西斯

【问题讨论】:

  • 我可以看到另一个问题的答案与我的问题的答案相同。但是,我认为另一个问题是用如此笼统的术语提出的,以至于我发现很难/不可能实施答案,而我的问题涉及一个非常具体和常见的问题(长面板数据)并提供了一个我相信会的具体答案使用(宽面板数据)。此外,另一个问题不要求能够根据价格-A、价格-B、价格-C 等组件的组合来命名变量。
  • 我建议一般学习如何整理数据,例如vita.had.co.nz/papers/tidy-data.html
  • 请所有将我的帖子标记为重复的人。我不认为这种批评是公平的。我看了 [其他帖子](stackoverflow.com/questions/5890584/… ) 大概 10 次,试图在最终发布之前理解它。我知道这篇文章似乎是多余的,但另一篇文章似乎也让我感到困惑。重塑已经是一个令人困惑的操作。过度概括与让提问者阅读手册一样有帮助。尊敬的,弗朗西斯
  • 这并不是批评(人们确实帮助了你,你得到了 cmets 和答案),但即使你解释了为什么你认为这篇文章没有帮助,我们也无法理解其中的区别用它。而且我认为您实际上已确认:您接受的解决方案与其他问题所接受的解决方案完全相同。
  • 我们将问题标记为重复的原因并不是为了防止人们帮助您,而是为了整理网站。

标签: r reshape


【解决方案1】:

您可以为此使用reshape

reshape(my.df,direction="wide", idvar = "TIME", timevar = "ID")


#    TIME Price.A Price.B Price.C
#     1       1       2       3
#     2       4       5       6
#     3       7       8       9

【讨论】:

  • ID变量和时间变量的切换让我很奇怪。谢谢!
【解决方案2】:

或者你可以使用reshape2包中的dcast

require(reshape2)
dcast(my.df, TIME~ID, value.var="Price")

对于这个特定示例,reshapedcast 快。但是如果data.frame 变大,dcast 会更快。

# your example data
require(microbenchmark)
microbenchmark(
  dcast(my.df, TIME~ID, value.var="Price")
  ,
  reshape(my.df,direction="wide", idvar = "TIME", timevar = "ID")
)
# Unit: milliseconds
#    expr      min       lq   median       uq      max  neval
#   dcast 2.655360 2.690616 2.718508 2.766484 4.396740    100
# reshape 2.156866 2.191007 2.221800 2.279147 3.896462    100

# my sample data
rows <- 10
LETTERS2 <- do.call(paste0, list(rep(LETTERS, 26), rep(LETTERS, each=26)))
LETTERS3 <- do.call(paste0, list(rep(LETTERS, 26), rep(LETTERS2, each=26)))
my.df <- data.frame(ID=rep(LETTERS3[1:rows], rows), 
                    TIME=rep(1:rows, each=rows), Price=1:(rows^2))
microbenchmark(
  dcast(my.df, TIME~ID, value.var="Price")
  ,
  reshape(my.df,direction="wide", idvar = "TIME", timevar = "ID")
)
# Unit: milliseconds
#   expr       min       lq   median       uq      max  neval
#  dcast  2.742831 2.795938 2.841681 2.912416 4.570789    100
# reshape 6.571011 6.667631 6.749746 6.857076 8.891662    100

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多