4

私はいくつかの時間データを扱っていますが、時差を年と月に変換する際に問題があります。

私のデータは多かれ少なかれこのように見えます。

dfn <- data.frame(
Today  = Sys.time(),
DOB  = seq(as.POSIXct('2007-03-27 00:00:01'), len= 26, by="3 day"),
Patient  = factor(1:26, labels = LETTERS))

DOBまず、今日のデータ ( )から誕生のデータ ( ) を引きますToday

dfn$ageToday <-  dfn$Today - dfn$DOB

これにより、 が得られますTime difference in days

dfn$ageToday
 Time differences in days
  [1] 1875.866 1872.866 1869.866 1866.866 1863.866
  [6] 1860.866 1857.866 1854.866 1851.866 1848.866
 [11] 1845.866 1842.866 1839.866 1836.866 1833.866
 [16] 1830.866 1827.866 1824.866 1821.866 1818.866
 [21] 1815.866 1812.866 1809.866 1806.866 1803.866
 [26] 1800.866
 attr(,"tzone")
 [1] ""

これが私の質問の最初の部分です。この差を年と月に変換するにはどうすればよいですか (月に丸めます)。(つまり、4.7、4.11 など)

?difftimeman ページとを読みました?formatが、わかりませんでした。

どんな助けでも大歓迎です。

さらに、最終的なオブジェクトを溶かしたいのですが、このコマンドを使用して上記のデータ フレームで Melt を使用しようとすると、

require(plyr)
require(reshape)
mdfn <- melt(dfn, id=c('Patient'))

今まで見たことのない奇妙な警告が表示される

Error in as.POSIXct.default(value) : 
  do not know how to convert 'value' to class "POSIXct"

2 番目の質問は次のとおりです。変数と一緒にできる時差を作成するにはどうすればよいですか? meltPOSIXctdfn$ageToday私は魅力のようにすべての作品なしで溶けたら。

ありがとう、エリック

4

1 に答える 1

5

このlubridateパッケージにより、時差の検索など、日付と時刻の操作が非常に簡単になります。

library("lubridate")
library("reshape2")

dfn <- data.frame(
    Today  = Sys.time(),
    DOB  = seq(as.POSIXct('2007-03-27 00:00:01'), len= 26, by="3 day"),
    Patient  = factor(1:26, labels = LETTERS))

dfn$diff <- new_interval(dfn$DOB, dfn$Today) / duration(num = 1, units = "years")

mdfn <- melt(dfn, id=c('Patient'))
class(mdfn$value) # all values are coerced into numeric

このnew_interval()関数は、2 つの日付の時差を計算します。today()の使用に代わる機能があることに注意してくださいSys.time。最後にduration()、間隔を標準単位の長さ (この場合は 1 年単位) で割るために使用できる標準期間 (ehm) を作成する関数に注意してください。

Todayとの内容を保存したい場合は、最初DOBにすべてを変換し、character後で再変換することをお勧めします...

library("lubridate")
library("reshape2")

dfn <- data.frame(
  Today  = Sys.time(),
  DOB  = seq(as.POSIXct('2007-03-27 00:00:01'), len= 26, by="3 day"),
  Patient  = factor(1:26, labels = LETTERS))

# Create standard durations for a year and a month
one.year <- duration(num = 1, units = "years")
one.month <- duration(num = 1, units = "months")

# Calculate the difference in years as float and integer
dfn$diff.years <- new_interval(dfn$DOB, dfn$Today) / one.year
dfn$years <- floor( new_interval(dfn$DOB, dfn$Today) / one.year )

# Calculate the modulo for number of months
dfn$diff.months <- round( new_interval(dfn$DOB, dfn$Today) / one.month )
dfn$months <- dfn$diff.months %% 12

# Paste the years and months together
# I am not using the decimal point so as not to imply this is
# a numeric representation of the diference
dfn$y.m <- paste(dfn$years, dfn$months, sep = '|')

# convert Today and DOB to character so as to preserve them in melting
dfn$Today <- as.character(dfn$Today)
dfn$DOB <- as.character(dfn$DOB)

# melt using string representation of difference between the two dates
dfn2 <- dfn[,c("Today", "DOB", "Patient", "y.m")]
mdfn2 <- melt(dfn2, id=c('Patient'))

# alternative melt using numeric representation of difference in years
dfn3 <- dfn[,c("Today", "DOB", "Patient", "diff.years")]
mdfn3 <- melt(dfn3, id=c('Patient'))
于 2012-05-15T05:37:20.853 に答える