#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. о, это были мои ошибки. большое спасибо за вашу поддержку!!