У меня следующий фрейм данных:

df <- data.frame(Date= as.Date(c("2020-08-04","2020-08-04","2020-08-06","2020-08-06","2020-08-07","2020-08-07")),
                   Period= c("Day","Night","Day","Night","Day","Night"),
                   State.1= c(1, 0.45,0.48,0.32,0.29,0.87),
                   State.2= c(0, 0.55,0.28,0.62,0.79,0.17))
  
  df

         Date Period State.1 State.2
1 2020-08-04    Day    1.00    0.00
2 2020-08-04  Night    0.45    0.55
3 2020-08-06    Day    0.48    0.28
4 2020-08-06  Night    0.32    0.62
5 2020-08-07    Day    0.29    0.79
6 2020-08-07  Night    0.87    0.17

В котором я указываю для date и Period некоторые значения для State.1 и State.2. В целях иллюстрации я хотел бы переупорядочить мой фрейм данных, включив Period как в State.1, так и в State.2. Я ожидал получить следующее:

df2

       Date State.1_day State.1_night State.2_day State.2_night
1 2020-08-04        1.00          0.45        0.00          0.55
2 2020-08-05          NA            NA          NA            NA
3 2020-08-06        0.48          0.32        0.28          0.62
4 2020-08-07        0.29          0.87        0.79          0.17

Как я мог это сделать? Я попробовал melt(), но не смог получить то, что хотел.

Заранее спасибо.

1
Dekike 10 Ноя 2020 в 22:47

2 ответа

Лучший ответ

Вы могли сделать:

tidyr::pivot_wider(df, names_from = Period, values_from = c("State.1", State.2))
#> # A tibble: 3 x 5
#>   Date       State.1_Day State.1_Night State.2_Day State.2_Night
#>   <date>           <dbl>         <dbl>       <dbl>         <dbl>
#> 1 2020-08-04       1              0.45        0             0.55
#> 2 2020-08-06       0.48           0.32        0.28          0.62
#> 3 2020-08-07       0.290          0.87        0.79          0.17

Или, если вам нужна запись за каждый день, даже если этот день отсутствует в исходном фрейме данных, вы можете сделать:

dplyr::left_join(data.frame(Date = seq(min(df$Date), max(df$Date), by = "day")),
                 tidyr::pivot_wider(df, names_from = Period, 
                                   values_from = c("State.1", State.2)))

#>         Date State.1_Day State.1_Night State.2_Day State.2_Night
#> 1 2020-08-04        1.00          0.45        0.00          0.55
#> 2 2020-08-05          NA            NA          NA            NA
#> 3 2020-08-06        0.48          0.32        0.28          0.62
#> 4 2020-08-07        0.29          0.87        0.79          0.17
2
Allan Cameron 10 Ноя 2020 в 20:06

Мы можем использовать data.table

library(data.table)
dcast(setDT(df), Date ~ Period, value.var = c("State.1", "State.2"))
2
akrun 10 Ноя 2020 в 22:24