Создать новый столбец на основе разницы дат - PullRequest
2 голосов
/ 06 февраля 2020

У меня есть фрейм данных, в котором мне нужно создать новый столбец на основе разницы двух дат. Пример:

Col1 Col2 Col3  Date      New_Column_Required
 A    X    A   01/01/2001   Wave1
 B    Y    Q   01/01/2001   Wave1
 C    Z    N   01/01/2001   Wave1
 D    W    M   02/01/2001   Wave2
 E    Q    V   02/01/2001   Wave2
 F    R    O   03/01/2001   Wave3
 G    S    T   03/01/2001   Wave3

2-я дата - 1-я дата должна быть волной 1, 3-я дата - 2-я дата Волна 2 и так далее. Проблема, с которой я сталкиваюсь, заключается в том, что несколько дат не могут понять.

1 Ответ

3 голосов
/ 06 февраля 2020

Используя dplyr, мы можем изменить Date на класс Date, arrange их на основе Date и вычесть Date из значения first.

library(dplyr)

df %>%
  mutate(Date = lubridate::dmy(Date)) %>%
  arrange(Date) %>%
  mutate(new_col = paste0("Wave", Date - first(Date) + 1))
  #OR
  #mutate(new_col = paste0("Wave", as.integer(as.factor(Date))))


#  Col1 Col2 Col3       Date new_col
#1    A    X    A 2001-01-01   Wave1
#2    B    Y    Q 2001-01-01   Wave1
#3    C    Z    N 2001-01-01   Wave1
#4    D    W    M 2001-01-02   Wave2
#5    E    Q    V 2001-01-02   Wave2
#6    F    R    O 2001-01-03   Wave3
#7    G    S    T 2001-01-03   Wave3

И тот же лог c в базе R:

df$Date = as.Date(df$Date, "%d/%m/%Y")
df <- df[order(df$Date), ]
transform(df, new_col = paste0('Wave', Date - Date[1] + 1))

данные

df <- structure(list(Col1 = c("A", "B", "C", "D", "E", "F", "G"), Col2 = c("X", 
"Y", "Z", "W", "Q", "R", "S"), Col3 = c("A", "Q", "N", "M", "V", 
"O", "T"), Date = c("01/01/2001", "01/01/2001", "01/01/2001", 
"02/01/2001", "02/01/2001", "03/01/2001", "03/01/2001")), row.names = c(NA, 
-7L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...