0

昨年、以下のコードを使用して文字列を日時に変換し、機能しましたが、実行後に予期しない結果が得られましたstrptime

Data <- structure(list(time = c("12:00 AM", "1:00 AM", "2:00 AM",
  "3:00 AM", "4:00 AM", "5:00 AM", "6:00 AM", "7:00 AM", "8:00 AM",
  "9:00 AM", "10:00 AM", "11:00 AM")),
  .Names = "time", class = "data.frame", row.names = c(NA, -12L))

これにより、strptime から期待される結果が得られるのはなぜですか。

strptime(Data$time[1:10], format="%l:%M %p")
#  [1] "2013-03-01 00:00:00" "2013-03-01 01:00:00" "2013-03-01 02:00:00"
#  [4] "2013-03-01 03:00:00" "2013-03-01 04:00:00" "2013-03-01 05:00:00"
#  [7] "2013-03-01 06:00:00" "2013-03-01 07:00:00" "2013-03-01 08:00:00"
# [10] "2013-03-01 09:00:00"

しかし、既存のデータを新しいデータ形式に置き換えようとすると、警告が表示され、次のような予期しない結果が発生します。

Data$time[1:10] <- strptime(Data$time[1:10], format="%l:%M %p")
# Warning message:
# In Data$time[1:10] <- strptime(Data$time[1:10], format = "%l:%M %p") :
#   number of items to replace is not a multiple of replacement length
Data
#                                                time
# 1                      0, 0, 0, 0, 0, 0, 0, 0, 0, 0
# 2                      0, 0, 0, 0, 0, 0, 0, 0, 0, 0
# 3                      0, 1, 2, 3, 4, 5, 6, 7, 8, 9
# 4                      1, 1, 1, 1, 1, 1, 1, 1, 1, 1
# 5                      2, 2, 2, 2, 2, 2, 2, 2, 2, 2
# 6  113, 113, 113, 113, 113, 113, 113, 113, 113, 113
# 7                      5, 5, 5, 5, 5, 5, 5, 5, 5, 5
# 8            59, 59, 59, 59, 59, 59, 59, 59, 59, 59
# 9                      0, 0, 0, 0, 0, 0, 0, 0, 0, 0
# 10                     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
# 11                                         10:00 AM
# 12                                         11:00 AM

Data$time[1:10] <- strptime(Data$time[1:10], format="%l:%M %p")上記の質問のコードを実行しView(Data)、結果のデータを標準の RGui で実行すると、期待どおりに見えますがView(Data)、RStudio で上記の予期しない結果が表示されます。RGui と RStudio の両方で、関数class(Data$time), が戻り[1] "POSIXlt" "POSIXt"、期待どおりに動作します。これは、RStudio でのデータの表示に問題があるようです。

4

1 に答える 1

1

Rの以前のバージョンでサポートされていない限り、これが過去にどのように機能したかはわかりません...

strptimeオブジェクトを返しPOSIXltます。これは、いくつかのコンポーネントを含むリストです (?POSIXlt要素の説明については、を参照してください)。この問題は、文字ベクトルの一部をオブジェクトに置き換えようとするために発生しPOSIXltます。これにより、列全体がリストに変換されます。最初の 10 要素はPOSIXltオブジェクトのコンポーネントであり、最後の 2 つは文字ベクトルの元の要素です。

列全体を の結果で置き換えるstrptimeか、新しい列を の結果で作成すると、すべてが正常に機能しstrptimeます。

Data$time2 <- strptime(Data$time, format="%l:%M %p")
Data$time  <- strptime(Data$time, format="%l:%M %p")
于 2013-03-01T23:13:47.893 に答える