2015-12-03 7 views
0

У меня есть последовательность дат в R, и для каждой даты мне нужно получить год, месяц и день. Я попытался использовать функцию strftime для распечатки года, но R ведет себя очень странно. Этот код не:Должна быть указана дата преобразования в For Loop in R - origin

# sequence of dates 
dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1) 

# this fails with "'origin' must be supplied" error: 
for (d in dates) { 
    year <- strftime(d, "%Y") 
    print(year) 
} 

Точное сообщение об ошибке: Error in as.POSIXlt.numeric(x, tz = tz) : 'origin' must be supplied

С другой стороны, этот код работает без ошибок:

# sequence of dates 
dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1) 

# this works 
for (i in 1: length(dates)) { 
    year <- strftime(dates[i], "%Y") 
    print(year) 
} 

Почему первый пример строя и второй пример работает? Я подозреваю, что в первом примере R пытается преобразовать мою дату в какой-то объект POSIXct, а во втором примере это не так? Я смущен, почему есть какая-то разница, и я буду благодарен за объяснение того, что происходит. Я использую R 3.2.2.

+1

Связанный: [Зацикливание объекта Date в числовом итераторе] (http://stackoverflow.com/q/6434663/271616). –

ответ

1

for создает d как числовое. Вот два подхода.

Ниже были удалены комментарии, а только коды с пометкой ## изменены.

1) список Используйте список, как это:

dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1) 

for (d in as.list(dates)) { ## 
    year <- strftime(d, "%Y") 
    print(year) 
} 

2) as.Date или конвертировать d обратно в "Date" класса.

dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1) 

for (d in dates) { 
    year <- strftime(as.Date(d, origin = "1970-01-01"), "%Y") ## 
    print(year) 
} 
+0

интересный ... Вот почему, когда я делаю 'for (d в датах) {print (d)}' i 'm получает числа, такие как 8033, 8034, ... – jirikadlec2