转换data.frame的melt/cast方法

转换data.frame的melt/cast方法,r,dataframe,R,Dataframe,看起来这个问题将是绝对基本的,但我不能想出一个简单的方法来解决它 我有一个简单的data.frame date quantile value 2020-12-26 0.05 261346 2020-12-26 0.95 283721 2021-01-02 0.05 334478 2021-01-02 0.95 365978 2021-

看起来这个问题将是绝对基本的,但我不能想出一个简单的方法来解决它

我有一个简单的data.frame

               date quantile   value
         2020-12-26     0.05  261346
         2020-12-26     0.95  283721
         2021-01-02     0.05  334478
         2021-01-02     0.95  365978
         2021-01-09     0.05  405375
         2021-01-09     0.95  443708
         2021-01-16     0.05  473139
         2021-01-16     0.95  517392

df <- structure(list(
  target_end_date = structure(c(18622, 18622, 18629, 18629, 18636, 18636, 18643, 18643), class = "Date"), 
  quantile = c(0.05, 0.95, 0.05, 0.95, 0.05, 0.95, 0.05, 0.95), 
  value = c(261346, 283721, 334478, 365978, 405375, 443708, 473139, 517392)), 
  class = "data.frame", 
  row.names = c(5L, 23L, 53L, 71L, 101L, 119L, 149L, 167L))
正如我所说的,听起来很简单,但我提出的唯一解决方案是残酷的重塑:

df %>% 
  reshape::cast(value + target_end_date ~ quantile, fill = 0 ) %>% 
  .[,c(2,3,4)] %>% 
  aggregate(.~target_end_date, ., sum)
有没有人有更简单更优雅的想法,因为这对我来说真的很糟糕

提前谢谢

在base R中,我们可以使用xtabs

-输出

#         quantile
#target_end_date   0.05   0.95
#     2020-12-26 261346 283721
#     2021-01-02 334478 365978
#     2021-01-09 405375 443708
#     2021-01-16 473139 517392
# A tibble: 4 x 3
#  target_end_date `0.05` `0.95`
#  <date>           <dbl>  <dbl>
#1 2020-12-26      261346 283721
#2 2021-01-02      334478 365978
#3 2021-01-09      405375 443708
#4 2021-01-16      473139 517392
或者这可以通过tidyr的pivot_加宽来完成

-输出

#         quantile
#target_end_date   0.05   0.95
#     2020-12-26 261346 283721
#     2021-01-02 334478 365978
#     2021-01-09 405375 443708
#     2021-01-16 473139 517392
# A tibble: 4 x 3
#  target_end_date `0.05` `0.95`
#  <date>           <dbl>  <dbl>
#1 2020-12-26      261346 283721
#2 2021-01-02      334478 365978
#3 2021-01-09      405375 443708
#4 2021-01-16      473139 517392
在base R中,我们可以使用xtabs

-输出

#         quantile
#target_end_date   0.05   0.95
#     2020-12-26 261346 283721
#     2021-01-02 334478 365978
#     2021-01-09 405375 443708
#     2021-01-16 473139 517392
# A tibble: 4 x 3
#  target_end_date `0.05` `0.95`
#  <date>           <dbl>  <dbl>
#1 2020-12-26      261346 283721
#2 2021-01-02      334478 365978
#3 2021-01-09      405375 443708
#4 2021-01-16      473139 517392
或者这可以通过tidyr的pivot_加宽来完成

-输出

#         quantile
#target_end_date   0.05   0.95
#     2020-12-26 261346 283721
#     2021-01-02 334478 365978
#     2021-01-09 405375 443708
#     2021-01-16 473139 517392
# A tibble: 4 x 3
#  target_end_date `0.05` `0.95`
#  <date>           <dbl>  <dbl>
#1 2020-12-26      261346 283721
#2 2021-01-02      334478 365978
#3 2021-01-09      405375 443708
#4 2021-01-16      473139 517392
您还可以从Reformate2使用dcast

对于data.table,您可以执行以下操作:

 data.table::setDT(df)
 data.table::dcast(df,target_end_date~quantile, sum)

  target_end_date   0.05   0.95
1:      2020-12-26 261346 283721
2:      2021-01-02 334478 365978
3:      2021-01-09 405375 443708
4:      2021-01-16 473139 517392
您还可以从Reformate2使用dcast

对于data.table,您可以执行以下操作:

 data.table::setDT(df)
 data.table::dcast(df,target_end_date~quantile, sum)

  target_end_date   0.05   0.95
1:      2020-12-26 261346 283721
2:      2021-01-02 334478 365978
3:      2021-01-09 405375 443708
4:      2021-01-16 473139 517392
使用“重塑”的基本R选项

给予

使用“重塑”的基本R选项

给予


我想第一种方法最合适!谢谢大家!@储存请随意选择一个张贴的答案,以便结束问题我想第一种方法最适合!谢谢大家!@储存请随意选择一个已发布的答案,以便结束问题