Как единовременно суммировать количество дней для данных за несколько лет?

#r

#r

Вопрос:

У меня есть данные, похожие на это. Я хотел бы единовременно суммировать день (я не уверен, что слово «единовременная сумма» правильное или нет) и создать новый столбец «дата», чтобы в новом столбце единовременно суммировалось количество данных за 3 года в порядке возрастания.

     year  month day
    2011    1   5
    2011    2   14
    2011    8   21
    2012    2   24
    2012    3   3
    2012    4   4
    2012    5   6
    2013    2   14
    2013    5   17
    2013    6   24
  

Я выполнил этот код, но результат был неправильным, и к тому же он слишком длинный. Февраль считается неправильно, поскольку в феврале всего 28 дней. есть ли какие-либо более короткие способы?

     cday <- function(data,syear=2011,smonth=1,sday=1){
       year <- data[1]
      month <- data[2]
      day <- data[3]
      cmonth <- c(0,31,28,31,30,31,30,31,31,30,31,30,31)
      date <- (year-syear)*365 sum(cmonth[1:month]) day
      for(yr in c(syear:year)){
      if(yr==year){
      if(yr%%4==0amp;amp;month>2){date<-date 1}
       }else{
         if(yr%%4==0){date<-date 1}
         }
       }
      return(date)
    }
   op10$day.no <- apply(op10[,c("year","month","day")],1,cday)



I expect the result like this:

    year  month day  date
    2011    1   5     5
    2011    1   14    14
    2011    1   21    21
    2011    1   24    24
    2011    2   3     31
    2011    2   4     32
    2011    2   6     34
    2011    2   14    42
    2011    2   17    45
    2011    2   24    52
  

Спасибо за помощь!!

Комментарии:

1. Мне непонятно. Как изменились ваши year и month столбцы? Как рассчитывается date столбец?

2. Используя ваши данные, your_data$date = with(your_data, as.Date(paste(year, month, day, sep = "-")); your_data$julian_day = as.numeric(format(your_data$date, "%j"))

3. Из вашего примера я не могу сказать, нужно ли вам, чтобы они накапливались годами. То есть, вы хотите, чтобы 2012-01-01` снова был днем 1 или днем 366. В последнем случае более простым способом было бы просто вычесть ваш 0 день, your_data$result = your_data$date - as.Date("2010-12-31")

4. @Ronak Shak. столбец даты является результатом суммирования дней, начиная с 1 января 2011 года

5. Дорогой Грегор. 2012-01-01 — это последний день. до конца данных.

Ответ №1:

Используйте Date классы. Даты и время сложны, ищите инструменты, которые сделают это за вас, а не пишите свои собственные. Выберите любой из них, который вы хотите:

 df$date = with(df, as.Date(paste(year, month, day, sep = "-")))

df$julian_day = as.integer(format(df$date, "%j"))
df$days_since_2010 = as.integer(df$date - as.Date("2010-12-31"))

df
#    year month day       date julian_day days_since_2010
# 1  2011     1   5 2011-01-05          5               5
# 2  2011     2  14 2011-02-14         45              45
# 3  2011     8  21 2011-08-21        233             233
# 4  2012     2  24 2012-02-24         55             420
# 5  2012     3   3 2012-03-03         63             428
# 6  2012     4   4 2012-04-04         95             460
# 7  2012     5   6 2012-05-06        127             492
# 8  2013     2  14 2013-02-14         45             776
# 9  2013     5  17 2013-05-17        137             868
# 10 2013     6  24 2013-06-24        175             906
  
 # using this data
df = read.table(text = "year  month day
    2011    1   5
    2011    2   14
    2011    8   21
    2012    2   24
    2012    3   3
    2012    4   4
    2012    5   6
    2013    2   14
    2013    5   17
    2013    6   24", header = TRUE)
  

Все это с использованием базы R. Если вы часто обрабатываете даты и время, вы также можете захотеть просмотреть lubridate пакет.

Комментарии:

1. Большое вам спасибо. Я только что попробовал. Но результат другой. В моих данных с 24 января 2011 года по 3 февраля 2011 года всего 7 дней, но считается 10 дней.

2. Между этими датами есть 10 дней. Если вы хотите, чтобы ответ был равен 7, то, я полагаю, я вас совершенно неправильно понял, и я понятия не имею, чего вы хотите. Я не вижу в ваших образцовых данных или желаемых выходных данных ничего, что указывало бы на то, что мы делаем что-то еще, кроме подсчета календарных дней.

3. Возможно, мне не следовало игнорировать вопрос Ронака. Почему столбцы year и month меняются при переходе от ввода к выводу? Я предположил, что вы показывали выходные данные для немного другого ввода, но, возможно, я ошибался…

4. Или вы пытаетесь посчитать рабочие дни? Торговые дни? Что-то еще?

5. о, это были мои ошибки. большое спасибо за вашу поддержку!!