Если еще заявления на даты в R - PullRequest
1 голос
/ 14 апреля 2020

Привет! Я пытаюсь создать новый столбец в моем фрейме данных, чтобы сказать "если 'SightDate' находится между 7-15 и 2-15, вернуть TRUE 1 иначе FALSE [0]" но может " Кажется, синтаксис для функций даты не найден в r. Это то, что я до сих пор.

#convert SightDate to Month-Day
sightingsData$SightMonthDay <- strptime(as.character(sightingsData$SightDate), "%m/%d/%Y")
sightingsData$SightMonthDay <- format.Date(sightingsData$SightMonthDay, "%m-%d")

#Get whether or not sighting occured during the proposed work period
startWork <- as.Date("07-15", format = "%m-%d")
endWork <- as.Date("02-15", format = "%m-%d")

sightingsData$WorkPeriod = ifelse(sightingsData$SightMonthDay >= startWork & sightingsData$SightMonthDay <= endWork, 1, 0)

Я получаю эту ошибку

Error in charToDate(x) : 
  character string is not in a standard unambiguous format

Я не уверен почему, потому что, когда я вынимаю запятую, вместо этого я получаю «неожиданную цифру 1».

Кроме того, я пытаюсь назначить сезоны моим данным, используя функцию, найденную на форуме. Но я борюсь с назначением даты в R и не могу понять это. Я хочу, чтобы в новом столбце под названием «SightSeason» или что-то в этом роде содержалось назначение сезонов.

sightingsData$sightSeason <- getSeason(sightingsData$SightMonthDay)

Но, похоже, я не вижу, где я могу объяснить это в Функция ниже ... до или после того, как я преобразовал свои sightingsData $ SightData в значения 2016 года или после. Это заставляет меня сомневаться, и я задаюсь вопросом, должен ли я создать промежуточный столбец, в котором я могу сохранить преобразование моих значений sightingsData $ SightDate в значения 2016 года - что-то вроде sightingsData $ 2016Sight, чтобы я не мог постоянно изменять свой df. Я не совсем уверен в этом. Я прошу прощения за бессвязные, но я не уверен, как уточнить мои проблемы. В любом случае, это «функция получения сезонов»:

### Assign SightMonthDay to Season using 2016 Season Data
getSeason <- function(DATES)
  WS <- as.Date("2016-12-21", format = "%Y-%m-%d") # Winter Solstice
  SE <- as.Date("2016-3-19",  format = "%Y-%m-%d") # Spring Equinox
  SS <- as.Date("2016-6-20",  format = "%Y-%m-%d") # Summer Solstice
  FE <- as.Date("2016-9-22",  format = "%Y-%m-%d") # Fall Equinox

# Convert dates from any year to 2016 dates
d <- as.Date(strftime(DATES, format="2016-%m-%d"))

ifelse (d >= WS | d < SE, "Winter",
        ifelse (d >= SE & d < SS, "Spring",
                ifelse (d >= SS & d < FE, "Summer", "Fall")))

Любое понимание того, как я могу применить эту функцию, или если вы знаете другой способ назначения сезонов для моего набора данных, который был бы весьма полезен ! Чтобы уточнить, я использую 2016 год, потому что это был последний високосный год, для которого есть полные данные солнцестояния и равноденствия.

This is a screenshot of a bit of my df, it has a total of 23585 observations.

Это случайная выборка моих данных из 20 наблюдений:

       SightDate SightMonthDay
17092 10/23/2017         10-23
129    3/13/2009         03-13
20671  1/17/2018         01-17

И вывод dput (SampleData)

> dput(droplevels(SampleData[1:20, ]))
structure(list(SightDate = structure(c(1L, 16L, 18L, 7L, 8L, 
19L, 10L, 6L, 9L, 14L, 13L, 5L, 15L, 2L, 3L, 17L, 4L, 11L, 12L, 
20L), .Label = c("10/13/2015", "10/28/2017", "11/10/2018", "11/2/2018", 
"11/29/2012", "12/14/2017", "12/21/2013", "12/3/2016", "12/5/2017", 
"3/14/2016", "3/22/2015", "3/25/2011", "4/15/2018", "4/4/2014", 
"5/1/2017", "6/26/2016", "8/18/2015", "9/15/2017", "9/18/2015", 
"9/18/2017"), class = "factor"), SightMonthDay = c("10-13", "06-26", 
"09-15", "12-21", "12-03", "09-18", "03-14", "12-14", "12-05", 
"04-04", "04-15", "11-29", "05-01", "10-28", "11-10", "08-18", 
"11-02", "03-22", "03-25", "09-18")), row.names = c(9977L, 11703L, 
15804L, 6177L, 12954L, 9707L, 10774L, 19559L, 18897L, 6546L, 
21349L, 4797L, 14169L, 17403L, 23014L, 9410L, 22758L, 8440L, 
2854L, 15886L), class = "data.frame")

Извините, я не совсем понимаю, как опубликовать образец моих данных, чтобы другие могли им манипулировать.

Спасибо за ваше время!

1 Ответ

1 голос
/ 14 апреля 2020

Вам не нужен столбец SightMonthDay.

#Function to get season
getSeason <- function(d) {
   WS <- as.Date("2016-12-21") # Winter Solstice
   SE <- as.Date("2016-3-19") # Spring Equinox
   SS <- as.Date("2016-6-20") # Summer Solstice
   FE <- as.Date("2016-9-22") # Fall Equinox

 ifelse (d >= WS | d < SE, "Winter",
      ifelse (d >= SE & d < SS, "Spring",
              ifelse (d >= SS & d < FE, "Summer", "Fall")))
}
#Change to standard date format
SampleData$date <- as.Date(SampleData$SightDate, format = '%m/%d/%Y')
#Make date of the same year i.e 2016
SampleData$date <- as.Date(format(SampleData$date, "2016-%m-%d"))
#Get season for each date. 
SampleData$SightSeason <- getSeason(SampleData$date)

head(SampleData)
#       SightDate       date SightSeason
#9977  10/13/2015 2016-10-13        Fall
#11703  6/26/2016 2016-06-26      Summer
#15804  9/15/2017 2016-09-15      Summer
#6177  12/21/2013 2016-12-21      Winter
#12954  12/3/2016 2016-12-03        Fall
#9707   9/18/2015 2016-09-18      Summer
...