【问题标题】:Reformat data frame in R for hourly values为每小时值重新格式化 R 中的数据框
【发布时间】:2022-11-28 07:53:05
【问题描述】:

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

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

前两列为字符格式,其余为数字。 t_0h.. 列表示特定时间的值。

我想像这样重新格式化上述数据:日期、小时(单独的列,0 - 6)、A 和 B 的每小时值作为单独的列,等等(下一个日期..)。

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

我尝试了以下方法:

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

但到目前为止没有成功。有人可以在这里帮助(或给出提示)以实现所需的输出吗?

以下是再现性的示例数据:

CharDate<- c("xyz_20110101", "xyz_20110101", "xyz_20110102", "xyz_20110102")
loc <- c("A", "B", "A", "B")
t_0h <- c(seq(2,5,length.out=4))
t_1h <- c(seq(20,40,length.out=4))
t_2h <- c(seq(5,11,length.out=4))
t_3h <- c(seq(12,19,length.out=4))
t_4h <- c(seq(13,20,length.out=4))
t_5h <- c(seq(25,35,length.out=4))
t_6h <- c(seq(2,40,length.out=4))

df <- (data.frame(CharDate,loc,t_0h,t_1h,t_2h,t_3h,t_4h,t_5h,t_6h))
df

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用pivot_longer/pivot_wider

    library(tidyr)
    library(dplyr)
     pivot_longer(df, cols = starts_with("t_"),
        names_to = c(".value", "Hour"), names_pattern = "^(.)_(\d+)h") %>% 
      pivot_wider(names_from = loc, values_from = t)
    

    -输出

    # A tibble: 14 × 4
       CharDate     Hour      A     B
       <chr>        <chr> <dbl> <dbl>
     1 xyz_20110101 0       2     3  
     2 xyz_20110101 1      20    26.7
     3 xyz_20110101 2       5     7  
     4 xyz_20110101 3      12    14.3
     5 xyz_20110101 4      13    15.3
     6 xyz_20110101 5      25    28.3
     7 xyz_20110101 6       2    14.7
     8 xyz_20110102 0       4     5  
     9 xyz_20110102 1      33.3  40  
    10 xyz_20110102 2       9    11  
    11 xyz_20110102 3      16.7  19  
    12 xyz_20110102 4      17.7  20  
    13 xyz_20110102 5      31.7  35  
    14 xyz_20110102 6      27.3  40  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多