1. ホーム
  2. r

[解決済み] spread() を使用して、日付時刻をカラム名に変換する

2022-02-19 03:40:11

質問

2つの列を持つデータセットがあります。1つ目は 'key' という名前で datetime を含み(現在は文字の形ですが)、2つ目はさらに datetime 値を含みます。キー行を列名にするためにspreadを使いたいと思います。ちょっと複雑ですが、これができたら、tibbleをリストに変換して、それを別の関数で使用して、datetimeカラムの見出しで名前を付けられたスケジュールを作成するつもりです。

データは今こんな感じです。

new_dat <- structure(list(key = c("2018-01-01 01:00:00", "2018-01-01 01:00:00", 
                       "2018-01-01 01:00:00", "2018-01-01 01:00:00", "2018-01-01 01:00:00", 
                       "2018-01-02 01:00:00", "2018-01-02 01:00:00", "2018-01-02 01:00:00", 
                       "2018-01-02 01:00:00", "2018-01-02 01:00:00", "2018-01-03 01:00:00", 
                       "2018-01-03 01:00:00", "2018-01-03 01:00:00", "2018-01-03 01:00:00", 
                       "2018-01-03 01:00:00"), value = structure(c(1514835600, 1514920800, 
                                                                   1515013380, 1515100860, 1515173100, 1514925060, 1514994060, 1515088920, 
                                                                   1515181020, 1515271740, 1515011880, 1515079200, 1515174240, 1515256980, 
                                                                   1515345600), class = c("POSIXct", "POSIXt"), tzone = "America/Boise")), class = c("tbl_df", 
                                                                                                                                                     "tbl", "data.frame"), row.names = c(NA, -15L), .Names = c("key", 
                                                                                                                                                                                                               "value"))

そして、このような形にしたいのです。

A tibble: 7,201 x 3
    `2018-01-01 01:00:00` `2018-01-02 01:00:00` `2018-01-03 01:00:00`
    <dttm>                <dttm>                <dttm>               
    2018-01-01 01:00:00   2018-01-02 01:00:00   2018-01-03 01:00:00

spread()を使ってみたところ、以下のようなエラーが発生しました。

Error in eval_tidy(enquo(var), var_env) : object '' not found

spread()でdatetimeをカラム名にすることは可能ですか?

どのように解決するのですか?

レコードが重複しているので、シーケンスカラムが必要です。

library(tidyverse)
new_dat %>%
  group_by(key) %>% 
  mutate(rn = row_number()) %>% 
  spread(key, value) %>%
  select(-rn)
# A tibble: 5 x 3
#  `2018-01-01 01:00:00` `2018-01-02 01:00:00` `2018-01-03 01:00:00`
#  <dttm>                <dttm>                <dttm>               
#1 2018-01-01 12:40:00   2018-01-02 13:31:00   2018-01-03 13:38:00  
#2 2018-01-02 12:20:00   2018-01-03 08:41:00   2018-01-04 08:20:00  
#3 2018-01-03 14:03:00   2018-01-04 11:02:00   2018-01-05 10:44:00  
#4 2018-01-04 14:21:00   2018-01-05 12:37:00   2018-01-06 09:43:00  
#5 2018-01-05 10:25:00   2018-01-06 13:49:00   2018-01-07 10:20:00