在R中:如何从时间戳创建连续的日期间隔
我有一个数据框,里面记录了出入境的人。 “date”(日期)和“inout”(输入输出)表示一个人在什么日期入境或出境。 Id=1于2008年10月06日出境,并于2009年4月30日再次返回 数据: 每个人的第一次停留以默认日期1900-01-01开始,最后一次停留以当前日期(2017-08-01)结束。 在此数据框中,Id=1在1900-01-01至2008-10-06期间为国内,在2008-10-06至2009-04-30期间为国外,在2009-04-30至2017-08-01期间为国内 有人能帮我吗。如有必要,最好使用dplyr软件包。在R中:如何从时间戳创建连续的日期间隔,r,date,R,Date,我有一个数据框,里面记录了出入境的人。 “date”(日期)和“inout”(输入输出)表示一个人在什么日期入境或出境。 Id=1于2008年10月06日出境,并于2009年4月30日再次返回 数据: 每个人的第一次停留以默认日期1900-01-01开始,最后一次停留以当前日期(2017-08-01)结束。 在此数据框中,Id=1在1900-01-01至2008-10-06期间为国内,在2008-10-06至2009-04-30期间为国外,在2009-04-30至2017-08-01期间为国内
致以最诚挚的问候这是我的解决方案。它假定
df
每次行程有两个连续的行,因此数据集中的行数为偶数(否则将不起作用)。为了测试这一点,我在df
中添加了一个新行,正如上面粘贴的那样,它只有7行,因此第四次行程将不完整:
library(dplyr)
library(tidyr)
library(lubridate)
df %>%
mutate(trips = rep(seq(1, n() / 2), each = 2)) %>%
group_by(trips) %>%
spread(inout, date) %>%
mutate(start = if_else(date(I) < date(O), I, O),
end = if_else(date(I) < date(O), O, I),
destination = if_else(date(I) < date(O), 'home', 'abroad')) %>%
ungroup %>%
select(-c(trips, I, O))
## id start end destination
## <chr> <fctr> <fctr> <chr>
## 1 1 2008-10-06 2009-04-30 abroad
## 2 2 1999-07-25 2004-02-27 home
## 3 2 2005-06-09 2013-07-01 home
## 4 3 2010-09-07 2012-03-08 home
库(dplyr)
图书馆(tidyr)
图书馆(lubridate)
df%>%
突变(trips=rep(seq(1,n()/2),each=2))%>%
组别(行程)%>%
价差(inout,日期)%>%
变异(开始=如果其他(日期(I)<日期(O),I,O),
结束=如有其他情况(日期(I)<日期(O),O,I),
目的地=if_else(日期(I)<日期(O),'国内','国外')%>%
解组%>%
选择(-c(行程、I、O))
##id起始结束目的地
##
##1 2008-10-06 2009-04-30国外
##2 1999-07-25 2004-02-27家居
##32 2005-06-09 2013-07-01首页
##432010-09-07 2012-03-08首页
底部右侧。相当凌乱。似乎有效
do.call(rbind, lapply(split(df, df$id), function(a) {
cbind(id = rep(a$id, length.out = NROW(a)+1),
setNames(object = data.frame(do.call(
rbind, lapply(1:(NROW(a) + 1), function(i)
c("1970-01-01", as.character(a$date), "2017-08-01")[i:(i + 1)])
)),
nm = c("Start", "End")),
Destination = if (a$inout[1] == "O") {
rep(x = c("home", "abroad"),
length.out = NROW(a) + 1)
} else{
rep(x = c("abroad", "home"),
length.out = NROW(a) + 1)
})
}))
# id Start End Destination
#1.1 1 1970-01-01 2008-10-06 home
#1.2 1 2008-10-06 2009-04-30 abroad
#1.3 1 2009-04-30 2017-08-01 home
#2.1 2 1970-01-01 1999-07-25 abroad
#2.2 2 1999-07-25 2004-02-27 home
#2.3 2 2004-02-27 2005-06-09 abroad
#2.4 2 2005-06-09 2013-07-01 home
#2.5 2 2013-07-01 2017-08-01 abroad
#3.1 3 1970-01-01 2010-09-07 abroad
#3.2 3 2010-09-07 2017-08-01 home
由于同一个
id
有不同的行程,我们是否可以假设每次行程的开始和结束日期始终显示在连续的行中?@Oriol,是的。数据的格式始终与df中的格式相同。Michaelsorry-每个id有奇数行。就像在我的df中,只有一行id=3。还有3行的id。在这些情况下,如何填写开始、结束和目的地的信息?
library(dplyr)
library(tidyr)
library(lubridate)
df %>%
mutate(trips = rep(seq(1, n() / 2), each = 2)) %>%
group_by(trips) %>%
spread(inout, date) %>%
mutate(start = if_else(date(I) < date(O), I, O),
end = if_else(date(I) < date(O), O, I),
destination = if_else(date(I) < date(O), 'home', 'abroad')) %>%
ungroup %>%
select(-c(trips, I, O))
## id start end destination
## <chr> <fctr> <fctr> <chr>
## 1 1 2008-10-06 2009-04-30 abroad
## 2 2 1999-07-25 2004-02-27 home
## 3 2 2005-06-09 2013-07-01 home
## 4 3 2010-09-07 2012-03-08 home
do.call(rbind, lapply(split(df, df$id), function(a) {
cbind(id = rep(a$id, length.out = NROW(a)+1),
setNames(object = data.frame(do.call(
rbind, lapply(1:(NROW(a) + 1), function(i)
c("1970-01-01", as.character(a$date), "2017-08-01")[i:(i + 1)])
)),
nm = c("Start", "End")),
Destination = if (a$inout[1] == "O") {
rep(x = c("home", "abroad"),
length.out = NROW(a) + 1)
} else{
rep(x = c("abroad", "home"),
length.out = NROW(a) + 1)
})
}))
# id Start End Destination
#1.1 1 1970-01-01 2008-10-06 home
#1.2 1 2008-10-06 2009-04-30 abroad
#1.3 1 2009-04-30 2017-08-01 home
#2.1 2 1970-01-01 1999-07-25 abroad
#2.2 2 1999-07-25 2004-02-27 home
#2.3 2 2004-02-27 2005-06-09 abroad
#2.4 2 2005-06-09 2013-07-01 home
#2.5 2 2013-07-01 2017-08-01 abroad
#3.1 3 1970-01-01 2010-09-07 abroad
#3.2 3 2010-09-07 2017-08-01 home