创建一个新列,根据两列添加天数,一列有数据,另一列有 ID
Create a new column adding days based in two columns one have data and another ID
我有一个 data.frame loc_teste2
列:Ptt
(我有 36 个不同的 Ptt's)和 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)
Returns:
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
,根据第一个日期为 Days
列中的每个 Ptt
添加 40 天,其中:
如果日期距离 Ptt
、returns 1
的第一个日期最多 40 天
如果日期是从Ptt
的第一个日期算起40天之后,就returns2
,像这样:
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:最好用日期 + 40 天创建一个列 Mig
,然后用 1 或 2 创建另一个列 Mig2
?
如果您使用 tidyverse 和 lubridate 包,您可以利用 group_by 函数并更轻松地操作日期。下面的代码有一些中间步骤来重现您的部分数据,但您可以只使用 "group_by" 之后的块。它会 return 真或假,而不是一两个,但如果需要,您可以使用 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)
我有一个 data.frame loc_teste2
列:Ptt
(我有 36 个不同的 Ptt's)和 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)
Returns:
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
,根据第一个日期为 Days
列中的每个 Ptt
添加 40 天,其中:
如果日期距离 Ptt
、returns 1
的第一个日期最多 40 天
如果日期是从Ptt
的第一个日期算起40天之后,就returns2
,像这样:
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:最好用日期 + 40 天创建一个列 Mig
,然后用 1 或 2 创建另一个列 Mig2
?
如果您使用 tidyverse 和 lubridate 包,您可以利用 group_by 函数并更轻松地操作日期。下面的代码有一些中间步骤来重现您的部分数据,但您可以只使用 "group_by" 之后的块。它会 return 真或假,而不是一两个,但如果需要,您可以使用 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)