【发布时间】:2021-02-01 15:37:07
【问题描述】:
这可能已经得到回答,但我找不到我想要的。
我有一个像这样的数据框:
Area <- c(1,1,1,1,2,2,2,2,3,3,3,3)
Scenario <- c(a,b,c,d,a,b,c,d,a,b,c,d)
Type <- c(EV, EV, EV, EV, EV, EV, EV, EV, EV, EV, EV, EV,)
Y2020 <- c(0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,1.6)
Y2021 <- c(0.2,0.4,0.5,0.6,0.8,1.0,1.0,1.1,1.2,1.5,1.3,1.5)
y2022 <- c(0.3,0.6,0.2,0.7,0.5,0.6,0.7,0.8,0.9,1.1,1.3,1.6)
dt <- data.frame(Area,Scenario, Y2020, Y2021, Y2022)
所以看起来像:
Area Scenario Type Y2020 Y2021 Y2022
1 a EV 0.5 0.2 0.3
1 b EV 0.6 0.4 0.6
1 c EV 0.7 0.5 0.8
1 d EV 0.8 0.6 0.7
2 a EV 0.9 0.8 0.5
2 b EV 1.0 1.0 0.6
2 c EV 1.1 1.0 0.7
2 d EV 1.2 1.1 0.8
3 a EV 1.3 1.2 0.9
3 b EV 1.4 1.5 1.1
3 c EV 1.5 1.3 1.3
3 d EV 1.6 1.5 1.6
我想通过按这样的场景列旋转来获得宽格式:
Area Type Y2020_a Y2021_a Y2022_a Y2020_b Y2021_b ...
1 EV 0.5 0.2 0.3 0.6 0.4
2 EV 0.9 0.8 0.5 1.0 1.0
3 EV 1.3 1.2 0.9 1.4 1.5
我尝试使用 dcast(dt, id ~ Scenario, value.var=names(dt)[4:6]) 正如@Arun 从Reshape multiple values at once 建议的那样,但它返回“.subset2 中的错误(x, i , exact = exact) : 递归索引在第 2 级失败”
这是我的实际数据的精简版本,所以如果可以用更大的数据集复制它,那就太好了!
希望有人能帮忙!谢谢
【问题讨论】:
-
尝试查看
tidyr::pivot_wider(),此处的文档:tidyr.tidyverse.org/reference/pivot_wider.html。 tidyverse 中的功能往往会得到更好的维护。 -
@seagullnutkin 你能提供一些证据证明这个说法吗?根据我的经验,tidyverse 函数往往会非常频繁地更改其整个 API。
-
@DavidArenburg 他们最近对 tidyverse 中的功能进行了一系列更新,但它由 RStudio 维护,所以我认为 tidyverse 软件包确实得到了更多人的关注/维护投资于保持它的工作。
reshape2也是一个很好的包,但我喜欢使用 tidyverse,因为包生态系统和良好的文档。这是个人喜好。 -
@seagullnutkin rehsape2 甚至不再维护。 OP 指的是维护得很好的 data.table 包。
-
无论如何,
library(data.table) ; dcast(melt(setDT(dt), id = c("Area", "Type", "Scenario")), Area + Type ~ variable + Scenario)
标签: r data.table transformation reshape2 dcast