У меня есть фрейм данных со столбцом под названием «Дата» в формате даты:

 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"))

И мне нужно создать столбец, который изменяет уникальную комбинацию год / месяц в столбце Date на непрерывную переменную месяца. У меня есть данные за 20 лет, и месяцы с 1-240.

Таким образом, пример для df выше вернет:

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"))

ПРИМЕЧАНИЕ: 01/1997 будет первым месяцем, и я пропустил месяцы 02/1997 (2-й месяц) -12/1997 (12-й месяц) в примере кадра данных, поэтому 01/1998 будет 13-м месяцем в серии.

r
6
Danielle 5 Сен 2017 в 00:41

4 ответа

Лучший ответ

Вы можете использовать year и month из lubridate для извлечения соответствующей информации

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
2
d.b 4 Сен 2017 в 22:05

Мы можем использовать 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
1
akrun 4 Сен 2017 в 21:57

Другое базовое R решение с еще большим количеством вариаций, добавленных к данным:

> # 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
0
sindri_baldur 4 Сен 2017 в 23:52

1) годовой класс

Класс "yearmon" отображает год / месяц внутри страны как год плюс 0, 1/12, 2/12 и т. Д. Для января, февраля, марта и т. Д., Поэтому:

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

Решение с использованием базового класса "POSIXlt":

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
2
G. Grothendieck 4 Сен 2017 в 23:30