将R中的数据框重新格式化为每小时值

8iwquhpp  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(164)

我的R数据框中有一些数据,如下所示:

  1. CharDate loc t_0h t_1h t_2h t_3h t_4h t_5h t_6h
  2. xyz_20110101 A 2 20.00000 5 12.00000 13.00000 25.00000 2.00000
  3. xyz_20110101 B 3 26.66667 7 14.33333 15.33333 28.33333 14.66667
  4. xyz_20110102 A 4 33.33333 9 16.66667 17.66667 31.66667 27.33333
  5. xyz_20110102 B 5 40.00000 11 19.00000 20.00000 35.00000 40.00000

前两列为字符格式,其余为数字。t_0h..列表示特定小时的值。
我想重新格式化上面的数据,如下所示:日期、小时(单独列,0 - 6)、A和B的每小时值(作为单独的列)等等(下一个日期..)。

  1. CharData Hour t_A t_B
  2. xyz_20110101 0 2 3
  3. xyz_20110101 1 20 26.6
  4. xyz_20110101 2 5 7
  5. xyz_20110101 3 12 14.3
  6. xyz_20110101 4 13 15.3
  7. xyz_20110101 5 25 28.3
  8. xyz_20110101 6 2 14.6
  9. xyz_20110102 0 4 5
  10. xyz_20110102 1 33.3 40
  11. xyz_20110102 2 9 11
  12. xyz_20110102 3 16.6 19
  13. xyz_20110102 4 17.6 20
  14. xyz_20110102 5 31.6 35
  15. xyz_20110102 6 27.3 40

我尝试了以下方法:

  1. # A simple transpose
  2. df2 <- data.frame(t(df[-c(1,2)]))
  3. # Melt via data.table
  4. long <- melt(setDT(df), id.vars = c("CharDate"))
  5. and pivot_longer() from tidyr package

但到目前为止还没有成功。这里有没有人能帮忙(或给予提示)来达到预期的输出?
以下是再现性的示例数据:

  1. CharDate<- c("xyz_20110101", "xyz_20110101", "xyz_20110102", "xyz_20110102")
  2. loc <- c("A", "B", "A", "B")
  3. t_0h <- c(seq(2,5,length.out=4))
  4. t_1h <- c(seq(20,40,length.out=4))
  5. t_2h <- c(seq(5,11,length.out=4))
  6. t_3h <- c(seq(12,19,length.out=4))
  7. t_4h <- c(seq(13,20,length.out=4))
  8. t_5h <- c(seq(25,35,length.out=4))
  9. t_6h <- c(seq(2,40,length.out=4))
  10. df <- (data.frame(CharDate,loc,t_0h,t_1h,t_2h,t_3h,t_4h,t_5h,t_6h))
  11. df
watbbzwu

watbbzwu1#

我们可以使用pivot_longer/pivot_wider

  1. library(tidyr)
  2. library(dplyr)
  3. pivot_longer(df, cols = starts_with("t_"),
  4. names_to = c(".value", "Hour"), names_pattern = "^(.)_(\\d+)h") %>%
  5. pivot_wider(names_from = loc, values_from = t)
  • 输出
  1. # A tibble: 14 × 4
  2. CharDate Hour A B
  3. <chr> <chr> <dbl> <dbl>
  4. 1 xyz_20110101 0 2 3
  5. 2 xyz_20110101 1 20 26.7
  6. 3 xyz_20110101 2 5 7
  7. 4 xyz_20110101 3 12 14.3
  8. 5 xyz_20110101 4 13 15.3
  9. 6 xyz_20110101 5 25 28.3
  10. 7 xyz_20110101 6 2 14.7
  11. 8 xyz_20110102 0 4 5
  12. 9 xyz_20110102 1 33.3 40
  13. 10 xyz_20110102 2 9 11
  14. 11 xyz_20110102 3 16.7 19
  15. 12 xyz_20110102 4 17.7 20
  16. 13 xyz_20110102 5 31.7 35
  17. 14 xyz_20110102 6 27.3 40
展开查看全部

相关问题