2016-12-14 1 views
0

В принципе, я смотрю данные о снежном покрове. Я хочу присвоить уникальную ценность каждой дате (столбец «снег») в период с 15 октября по 15 мая следующего года (зимний сезон, конечно) ~ 215 дней. затем добавьте столбец «snowmonth», который соответствует последовательным месяцам сезонных данных, а также столбец «снежный год», который представляет собой год начала каждой сезонной записи.Создание уникальной последовательности с 15 октября по 30 апреля следующего года - R

Есть некоторые недостающие даты, однако, но вместо того, чтобы находить эти даты и вставлять NA в строки, я решил пропустить этот шаг и вместо этого пойти последовательным корнем, который затем может быть нанесен на график относительно «снегового» "

в принципе, мне просто нужно, чтобы получить„snowday“последовательность примерно 1: 215 (+1 за високосных вниз в столбце, а все остальное я могу сделать сам похоже, что этот

month day year depth date yearday snowday snowmonth 
    12 26 1955 27 1955-12-26  360  NA  NA 
    12 27 1955 24 1955-12-27  361  NA  NA 
    12 28 1955 24 1955-12-28  362  NA  NA 
    12 29 1955 24 1955-12-29  363  NA  NA 
    12 30 1955 26 1955-12-30  364  NA  NA 
    12 31 1955 26 1955-12-31  365  NA  NA 
    1 1 1956 25 1956-01-01  1  NA  NA 
    1 2 1956 25 1956-01-02  2  NA  NA 
    1 3 1956 26 1956-01-03  3  NA  NA 


man<-data.table() 
man <-  read.delim('mansfieldstake.txt',header=TRUE, check.names=FALSE) 
man[is.na(man)]<-0 
man$date<-paste(man$yy, man$mm, man$dd,sep="-", collapse=NULL) 
man$yearday<-NA #day of the year 1-365 
colnames(man)<- c("month","day","year","depth", "date","yearday") 

man$date<-as.Date(man$date) 
man$yearday<-yday(man$date) 
man$snowday<-NA 
man$snowmonth<-NA 
man[420:500,] 
head(man) 
.

вывод будет выглядеть примерно так:

month day year depth date yearday snowday snowmonth 
    12 26 1955 27 1955-12-26  360  73  3 
    12 27 1955 24 1955-12-27  361  74  3 
    12 28 1955 24 1955-12-28  362  75  3 
    12 29 1955 24 1955-12-29  363  76  3 
    12 30 1955 26 1955-12-30  364  77  3 
    12 31 1955 26 1955-12-31  365  78  3 
    1 1 1956 25 1956-01-01  1  79  4 
    1 2 1956 25 1956-01-02  2  80  4 
    1 3 1956 26 1956-01-03  3  81  4 

Я думал о петлях и обо всем этом, но это неэффективно ... високосные годы тоже беспорядочные вещи - это стало более сложным, чем я думал. хороший первый проект!

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

+1

Можете ли вы показать нам, что вы ожидаете выход выглядеть? Не совсем понятно, о чем вы спрашиваете. будет 'человеческий $ снег <- 1: nrow (человек)'? – emilliman5

+0

человек $ snowday будет составлять 1: 215 или около того от% Y-10-15 до% Y + 1-5-15. С октября по май, каждый из которых просто ставит уникальную, упорядоченную ценность в последовательность периода - это определяет снег. эта последовательность повторяется для каждого снежного года. с 1955 по 2016 год. 15 октября - первый снег снега, а 15 мая - последний снег. – user5691676

ответ

0

Если я правильно понимаю, что snowday должно быть количество дней с начала сезона, все, что вам нужно сделать этот столбец с помощью data.table является:

day_one <- as.Date("1955-10-01") 
man[, snowday := -(date - day_one)] 

Если все, что вы хотите, это последовательность уникальных значения, то seq() - ваш лучший выбор.

Тогда вы можете создать snowmonth с помощью:

library(lubridate) 
man[, snowmonth := floor(-time_length(interval(date, day_one), unit = "month")) 
+0

спасибо за это, но мне нужно, чтобы он проходил через каждый снег с 1955 года до настоящего времени и обеспечивал около 60 или около 1: 215 снежных дней для каждого снежного года. Я думаю, я боюсь синтаксиса этого - потратил несколько дней, пытаясь заставить это работать! – user5691676

+0

Если это все в одной таблице данных, вы можете создать столбец 'day_one', который имеет ближайший 1 октября до даты col и применить вышеприведенное решение. –

Смежные вопросы