Создайте новый столбец, добавляющий дни на основе двух столбцов, один из которых содержит данные, а другой идентификатор.

У меня есть один data.frame loc_teste2 со столбцами: Ptt (у меня 36 разных Ptt) и Date, например:

Ptt      Date   
88734    05:39:18 23-Oct-2016  
88734    06:53:13 23-Oct-2016
88734    08:32:18 24-Oct-2016
88734    06:45:27 19-Dez-2016
88734    12:30:43 20-Dez-2016
129041   02:45:35 18-Nov-2016
129041   04:55:24 19-Nov-2016
129041   06:45:30 19-Nov-2016
129041   07:10:32 20-Nov-2016
129041   03:43:54 10-Jan-2017
120941   14:54:39 11-Jan-2017
...

Итак, я разделил столбец Date на другой столбец Days.

loc_teste2$Date<- as.character(loc_teste2$Date)

loc_teste2$Days <- sapply(strsplit(loc_teste2$Date, split=' ', fixed=TRUE), function(x) (x[2]))

loc_teste2$Days <- as.POSIXct(loc_teste2$Days, format = "%d-%b-%Y",tz = "GMT",usetz = TRUE)

loc_teste2$Date <- as.POSIXct(loc_teste2$Date, format = "%H:%M:%S %d-%b-%Y",tz = "GMT",usetz = TRUE)

Возврат:

Ptt      Date                       Days
88734    2016-10-23 05:39:18    2016-10-23
88734    2016-10-23 06:53:13    2016-10-23     
88734    2016-10-23 08:32:18    2016-10-24 
88734    2016-12-19 06:45:27    2016-12-19
88734    2016-12-20 12:30:43    2016-12-20
129041   2016-10-23 02:45:35    2016-10-18 
129041   2016-10-23 04:55:24    2016-11-19 
129041   2016-10-23 06:45:30    2016-11-19 
129041   2016-10-23 07:10:32    2016-11-20 
129041   2017-01-10 03:43:54    2017-01-10
120941   2017-01-11 14:54:39    2017-01-11
...

Затем я хочу создать новый столбец Mig, добавив 40 дней на основе первой даты для каждого Ptt в столбце Days, где: Если дата составляет до 40 дней с первой даты Ptt, возвращает 1 Если дата после Через 40 дней с первой даты Ptt он возвращает 2, например:

Ptt      Date                       Days        Mig
88734    2016-10-23 05:39:18    2016-10-23     1  #based in this date (the first date for this Ptt)
88734    2016-10-23 06:53:13    2016-10-23     1
88734    2016-10-23 08:32:18    2016-10-24     1 
88734    2016-12-19 06:45:27    2016-12-19     2
88734    2016-12-20 12:30:43    2016-12-20     2
129041   2016-10-23 02:45:35    2016-10-18     1  #based in this date (the first date for this Ptt)
129041   2016-10-23 04:55:24    2016-11-19     1 
129041   2016-10-23 06:45:30    2016-11-19     1 
129041   2016-10-23 07:10:32    2016-11-20     1 
129041   2017-01-10 03:43:54    2017-01-10     2
120941   2017-01-11 14:54:39    2017-01-11     2
...

У кого-нибудь есть идея, как это сделать?

Ps: Лучше создать столбец Mig с датами + 40 дней, а потом создать еще столбец Mig2 с 1 или 2?


person Érika Soares Coelho    schedule 24.06.2019    source источник
comment


Ответы (1)


Если вы используете пакеты tidyverse и lubridate, вы можете воспользоваться функцией group_by и упростить управление датами. В приведенном ниже коде есть несколько промежуточных шагов для воспроизведения части ваших данных, но вы можете просто использовать фрагмент после "group_by". Он вернет true или false вместо одного или двух, но вы можете отредактировать код с помощью функции ifelse (), если вам это нужно.

library(lubridate)
df <- read.delim(text = "Ptt      Date   
88734    05:39:18 23-Oct-2016  
88734    06:53:13 23-Oct-2016
88734    08:32:18 24-Oct-2016
88734    06:45:27 19-Dez-2016
88734    12:30:43 20-Dez-2016
129041   02:45:35 18-Nov-2016
129041   04:55:24 19-Nov-2016
129041   06:45:30 19-Nov-2016
129041   07:10:32 20-Nov-2016
129041   03:43:54 10-Jan-2017
120941   14:54:39 11-Jan-2017", sep = "\t")

df %>% 
  separate("Ptt......Date", into = c("ptt", "time", "date"), sep = "\\s+") %>% 
  mutate(date = str_replace(date, pattern = "Dez", replacement = "Dec"), date2 = dmy(date)) %>% 
  group_by(ptt) %>% 
  mutate(threshold = min(date2)+days(40), past_threshold = date2 > threshold)

Начиная с первого кадра данных только с Ptt и Date. Возможно, попробуйте следующее с загруженными lubridate и tidyverse.

library(tidyverse)
library(lubridate)
loc_teste2 %>% 
  mutate(Ptt = as.character(Ptt), Date = as.character(Date), Date = str_replace(Date, pattern = "Dez", replacement = "Dec"), Date = parse_date_time(Date, order = "hmsdmy")) %>% 
  group_by(Ptt) %>% 
  mutate(Threshold = min(Date) + days(40)) %>% 
  ungroup() %>% 
  mutate(Past_Threshold = Date > Threshold)

введите здесь описание изображения

person yfa    schedule 24.06.2019
comment
Спасибо Yfa, немного поработало! Возвращает новые столбцы threshold и past_thereshold, но результаты основаны только на одном Ptt, а не на каждом Ptt, как я могу это исправить? Я сделал это: loc_teste2 %>% group_by(Ptt) %>% mutate(threshold = min(Days)+days(40), past_threshold = Days > threshold) - person Érika Soares Coelho; 25.06.2019
comment
Нечетно, использование group_by должно брать минимум Days для каждого Ptt, чтобы дать вам порог для этого конкретного Ptt, тогда код просто сравнивает каждую строку с порогом. Возможно, проверьте структуру str(df) вашего фрейма данных по сравнению с тем, что вам дает копирование и вставка моего кода. И убедитесь, что у вас нет NA. И убедитесь, что ваш последний фрейм данных с новыми столбцами - это сгруппированный df, class(df). В противном случае я не уверен, в чем проблема, поскольку мой пример кода дает мне описанные вами результаты. - person yfa; 25.06.2019
comment
Я видел здесь, ваш класс df - это data.frame, а столбцы (после запуска вашего кода) Ptt - это символ. Мой df тоже data.frame, а столбец Ptt это был int, но я изменил на символ, не работал, затем я перешел на фактор, тоже не работает. У меня нет АН. И когда я запускаю код, мой класс df - "grouped_df" "tbl_df" "tbl" "data.frame". Я попытался перейти на класс data.frame и запустить внутри него, но тоже не сработало. - person Érika Soares Coelho; 25.06.2019
comment
Посмотрите мою правку и получите ли вы такой же результат, как и я. Если нет, то я действительно не знаю, что происходит. - person yfa; 25.06.2019
comment
Последнее, что вы можете захотеть проверить, это конфликты пространств имен функций: peytonmccullough .com / post / resolving-name-sizes-in-r Все должно быть из dplyr, lubridate или base r. - person yfa; 25.06.2019
comment
Большое спасибо! Проблема была в пакете plyr, я его отсоединяю, и он работает! - person Érika Soares Coelho; 25.06.2019