2012-07-18 84 views
0

我有一個基本的字符日向POSIXct功能如何使用[R不改變功能

charDateToPosixct <- function(chrDate, format, timeZone) { 
    as.POSIXct(chrDate, format=format, tz=timeZone) 
} 

我有日期的性格和時區的數據幀。

chrDate <- c("4/25/2012","4/24/2012","4/16/2012","6/30/2012") 
timeZone <- c("US/Eastern","US/Central","US/Pacific","US/Eastern") 
df <- data.frame(date=chrDate,timezone=timeZone) 
str(df) 
'data.frame': 4 obs. of 2 variables: 
$ date : Factor w/ 4 levels "4/16/2012","4/24/2012",..: 3 2 1 4 
$ timezone: Factor w/ 3 levels "US/Central","US/Eastern",..: 2 1 3 2 

我想約會的數據類型更改爲POSIXct,因此希望這個功能charDateToPosixct適用於每一行的格式"%m/%d/%y"

回答

3

使用在apply匿名函數這樣

apply(df, 1, function(x) charDateToPosixct(x[1], "%m/%d/%y", x[2])) 
#[1] 1587787200 1587704400 1587020400 1593489600 

編輯

你可以你有使用apply數字矢量轉換爲POSIXct

as.POSIXct(apply(df, 1, function(x) charDateToPosixct(x[1], "%m/%d/%y", x[2])), origin='1970-01-01') 
[1] "2020-04-25 05:00:00 CDT" "2020-04-24 06:00:00 CDT" "2020-04-16 08:00:00 CDT" "2020-06-30 05:00:00 CDT" 

或者,你可以使用lapply以獲取POSIXct對象的列表。然後,你可以用do.callc,或Reduce結合(你必須使用as.character因爲你隱式使用stringsAsFactors=TRUE在創建data.frame

do.call(c, lapply(seq_len(NROW(df)), function(i) { 
    charDateToPosixct(as.character(df$date[i]), "%m/%d/%Y", as.character(df$timezone[i])) 
})) 

或者,如果你有2個載體,你甚至都不需要data.frame

do.call(c, lapply(seq_along(chrDate), function(i) { 
    charDateToPosixct(chrDate[i], "%m/%d/%Y", timeZone[i]) 
})) 

或者,使用Reduce

Reduce(c, lapply(seq_along(chrDate), function(i) { 
    charDateToPosixct(chrDate[i], "%m/%d/%Y", timeZone[i]) 
})) 

我的時區是CDT,因此上述的任何給我

[1] "2012-04-24 23:00:00 CDT" "2012-04-24 00:00:00 CDT" "2012-04-16 02:00:00 CDT" "2012-06-29 23:00:00 CDT" 
+0

如果我使用的DF $ DATE1 < - 申請(......)它不改變數據類型posixct。 str(df $ date1)仍然是數字而不是posixct。 – 2sb 2012-07-18 22:40:20

+0

這就是「應用」的工作方式。我的結果與使用您所說的解決方法的結果相符。 – GSee 2012-07-18 22:41:27

+0

我說的問題的第二部分另外或解決方法是錯誤的,所以我省略了。對不起4混淆。 – 2sb 2012-07-18 22:44:11