2017-09-04 27 views
5

Mam dataframe z kolumną o nazwie „Data”, który jest w formacie DATA:Zmień datę zmiennej ciągłej miesiąca

df<- data.frame(date=c("1997-01-01", "1997-01-02", "1997-01-03", "1997-01-04", 
    "1997-01-05", "1997-01-06" ,"1997-01-07" ,"1997-01-08","1998-01-12", 
    "1998-01-13", "1998-01-14", "1998-01-15" ,"1998-01-16", "1998-01-17", 
    "1998-01-18", "1998-01-19")) 

I muszę zrobić kolumnę, która zmienia wyjątkowy rok/miesiąc combo w kolumna Date do ciągłej zmiennej miesięcznej. Mam 20 lat danych i będę mieć miesiące od 1-240.

więc przykładem dla df powyżej zwróciłby:

output<- data.frame(date=c("1997-01-01", "1997-01-02", "1997-01-03", 
"1997-01-04", "1997-01-05", "1997-01-06" ,"1997-01-07" ,"1997-01-08","1998-01-12", 
    "1998-01-13", "1998-01-14", "1998-01-15" ,"1998-01-16", "1998-01-17", 
    "1998-01-18", "1998-01-19"), continuous_month=c("1", "1", "1", "1", 
    "1", "1" ,"1" ,"1","13", "13", "13", "13" ,"13", "13", "13", "13")) 

UWAGA: 01/1997 byłby pierwszy miesiąc, a ja pominięty miesięcy 02/1997 (2 miesiąc) -12/1997 (12 miesiąc) w przykładowej ramce danych, więc 01/1998 będzie 13 miesiącem w serii.

Odpowiedz

2

Można użyć year i month z lubridate wyodrębnić istotne informacje

library(lubridate) 
df$date = ymd(df$date) 
temp = 12*(year(df$date) - min(year(df$date))) + month(df$date) 
df$output = temp - min(temp) + 1 
df$output 
# [1] 1 1 1 1 1 1 1 1 13 13 13 13 13 13 13 13 
+0

Nie sądzę, że daje to poprawny wynik, chyba że minimalny miesiąc to styczeń. – thelatemail

+0

Dziękuję, ta metoda zadziałała dla moich danych, ponieważ mój minimalny miesiąc to styczeń. Jednak pomocne byłoby również podejście uniwersalne (nieokreślone w szczegółach jednego zestawu danych), jak wskazano w @mail-mail. Dziękuję za rozmowę. – Danielle

+0

Świetnie, dziękuję bardzo! – Danielle

1

możemy użyć base R

df$continuous_month <- seq(1, 240, by = 12)[(as.integer(sub(".*-", "", df$date))%/%12) + 1] 
df$continuous_month 
#[1] 1 1 1 1 1 1 1 1 13 13 13 13 13 13 13 13 
+0

Myślę, że to rozwiązanie jest złe - używa informacji z części "dzień miesiąca", która jest nieistotna. – snoram

2

1) klasę yearmon

"yearmon" reprenents Klasa lat/miesiąc wewnętrznie jako y ucho plus 0, 1/12, 2/12 itd Jan, Feb, Mar, itd tak:

library(zoo) 

ym <- as.yearmon(df$date) 
12 * (ym - ym[1]) + 1 
## [1] 1 1 1 1 1 1 1 1 13 13 13 13 13 13 13 13 

2) POSIXlt klasa

Roztwór stosując bazę "POSIXlt" klasa :

with(as.POSIXlt(df$date), 12 * (year - year[1]) + mon - mon[1] + 1) 
## [1] 1 1 1 1 1 1 1 1 13 13 13 13 13 13 13 13 
+0

'unclass' na' as.POSIXlt' nie jest bezwzględnie potrzebny, czyż nie? – thelatemail

0

kolejna podstawa R roztwór niewielką więcej zmienności dodane do danych:

> # Format as date 
> df$date <- as.Date(df$date) 
> 
> # Add some more variations to the data 
> df$date <- df$date + sample(1:100, size = length(df$date)) 
> 
> # First the year difference and then the month difference. 
> df$continuous_month <- (as.integer(format(df$date, "%Y")) - 1997L) * 12L + 
+      as.integer(format(df$date, "%m")) 
> df 
     date continuous_month 
1 1997-01-28    1 
2 1997-02-05    2 
3 1997-01-31    1 
4 1997-01-09    1 
5 1997-01-15    1 
6 1997-01-29    1 
7 1997-03-23    3 
8 1997-02-24    2 
9 1998-02-20    14 
10 1998-02-18    14 
11 1998-01-17    13 
12 1998-02-22    14 
13 1998-02-01    14 
14 1998-04-06    16 
15 1998-02-12    14 
16 1998-03-01    15