转换data.frame的melt/cast方法
看起来这个问题将是绝对基本的,但我不能想出一个简单的方法来解决它 我有一个简单的data.frame转换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-
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选项
给予
我想第一种方法最合适!谢谢大家!@储存请随意选择一个张贴的答案,以便结束问题我想第一种方法最适合!谢谢大家!@储存请随意选择一个已发布的答案,以便结束问题