2015-06-07 18 views
1

我將兩個時間變量「Interaction2」和「Start2」轉換爲星期格式,以便我可以按星期彙總我的數據集。我想創建第三個變量「Weeks」,即「Interaction2」和「Start2」之間的區別。我用下面的命令的時候變量轉換成一年的標準日期格式,月,星期(而不是年,月,日):R:在嘗試獲得周差時轉換字符串時的difftime錯誤

d1$Interaction2<-format(d1$Interaction,'%Y-%m-%U') 
d1$Start2<-format(d1$Start,'%Y-%m-%U') 

爲「Interaction2」和「START2」結果出現格式正確,但它們是字符變量。我使用difftime函數來獲得差異,但結果是十進制:

d1$Weeks<-difftime(d1$Interaction2,d1$Start2,units='weeks') 

不應該結果是一個整數嗎? difftime命令是否將最後兩位數字解釋爲一天而不是一週?我如何獲得「Interaction2」周和「Start2」周之間的週數?

structure(list(Interaction2 = c("2015-02-06", "2015-02-08", "2015-03-09", 
"2015-03-11", "2015-03-12"), Start2 = c("1995-04-16", "1995-04-16", 
"1995-04-16", "1995-04-16", "1995-04-16"), Weeks = structure(c(1033.72023809524, 
1034.00595238095, 1038.14285714286, 1038.42857142857, 1038.57142857143 
), units = "weeks", class = "difftime")), .Names = c("Interaction2", 
"Start2", "Weeks"), row.names = c(NA, 5L), class = "data.frame") 

我也試着運行的不同命令前使用strptime字符變量轉換:

d1$Interaction3<-strptime(as.character(d1$Interaction2),"%Y%m%U") 
d1$Start3<-strptime(as.character(d1$Start2),"%Y%m%U") 
d1$Weeks<-difftime(d1$Interaction3,d1$Start3,units='weeks') 

,但是這導致NA的爲「Interaction3」,「START3」和「周」變量:

structure(list(Interaction2 = c("2015-02-06", "2015-02-08", "2015-03-09", 
"2015-03-11", "2015-03-12"), Start2 = c("1995-04-16", "1995-04-16", 
"1995-04-16", "1995-04-16", "1995-04-16"), Weeks = structure(c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_), units = "weeks", class = "difftime"), 
Start3 = structure(list(sec = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_), min = c(NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_), hour = c(NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), mday = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_), mon = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_), year = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_), wday = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_), yday = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_), isdst = c(-1L, 
-1L, -1L, -1L, -1L), zone = c("", "", "", "", ""), gmtoff = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_)), .Names = c("sec", 
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst", 
"zone", "gmtoff"), class = c("POSIXlt", "POSIXt")), Interaction3 = structure(list(
sec = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_ 
), min = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_), hour = c(NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_), mday = c(NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), mon = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_), 
year = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_), wday = c(NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_), yday = c(NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), isdst = c(-1L, 
-1L, -1L, -1L, -1L), zone = c("", "", "", "", ""), gmtoff = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_)), .Names = c("sec", 
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst", 
"zone", "gmtoff"), class = c("POSIXlt", "POSIXt"))), .Names = c("Interaction2", 
"Start2", "Weeks", "Start3", "Interaction3"), row.names = c(NA, 
5L), class = "data.frame") 
+0

試試'lubridate'軟件包。 –

+0

可能是http://stackoverflow.com/questions/20268977/how-to-have-a-difference-in-week-units-between-two-days-even-if-theyre-close-b – akrun

+0

如果你想要結果的整數部分,您只需對結果進行四捨五入即可。 'floor(difftime(as.Date(d1 $ Interaction2),as.Date(d1 $ Start2),units ='weeks'))' – agstudy

回答

0

嘗試此(添加單元參數)取決於difftime隱含地強迫一個字符變量爲數值一(POSIXct)和服用的數值差:

> difftime(mydf$Interaction2,mydf$Start2, units="weeks") 
Time differences in weeks 
[1] 1033.720 1034.006 1038.143 1038.429 1038.571 
相關問題