R 将面板数据从长形重塑为宽形

R 将面板数据从长形重塑为宽形,r,reshape,R,Reshape,我想将面板数据从长格式转换为宽格式。我知道还有很多其他问题涉及到这个问题,但是,我不相信他们中的任何一个都有我想要的确切答案 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

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

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

谢谢你能提供的任何帮助!弗朗西斯

您可以使用
重塑
来实现此目的:

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

或者,您可以使用
reformae2
软件包中的
dcast

require(reshape2)
dcast(my.df, TIME~ID, value.var="Price")
对于这个特定的示例,
重塑
dcast
更快。但是如果
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
#您的示例数据
要求(微基准)
微基准(
dcast(my.df,TIME~ID,value.var=“Price”)
,
重塑(my.df,direction=“wide”,idvar=“TIME”,timevar=“ID”)
)
#单位:毫秒
#expr最小lq中值uq最大neval
#dcast 2.655360 2.690616 2.718508 2.766484 4.396740 100
#重塑2.156866 2.191007 2.221800 2.279147 3.896462 100
#我的样本数据

我可以看到另一个问题的答案和我的问题的答案是一样的。然而,我认为另一个问题的提出过于笼统,以至于我发现很难/不可能实现答案,而我的问题涉及一个非常具体和常见的问题(长面板数据),并提供了一个我认为有用的具体答案(宽面板数据)。此外,另一个问题并不要求能够根据组件的组合(如Price-A、Price-B、Price-C)来命名变量。我建议学习如何整理数据,例如,请所有将我的帖子标记为重复的人。我认为这种批评是不公平的。我看了[其他帖子]()大概10次,试图弄明白它的意思,最后才发布这篇文章。我知道这篇文章似乎多余,但另一篇文章似乎太让我困惑了。重塑已经是一个令人困惑的操作。过度概括就像让提问者阅读手册一样有用。恕我直言,FrancisThis并不是批评(人们确实帮助了你,你得到了评论和答案),但即使你解释了为什么你认为那篇文章没有帮助,我们也没有理解其中的区别。我想你实际上已经证实了这一点:你接受的解决方案与另一个问题的解决方案完全相同。我们将问题标记为重复的原因不是为了阻止人们帮助你,而是为了整理网站。我很奇怪,ID变量和时间变量被切换。谢谢你!
# 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