根据R中的两个日期/时间列,在给定用户ID的列中选择一个值

根据R中的两个日期/时间列,在给定用户ID的列中选择一个值,r,matching,R,Matching,我有一个数据框,其中包含用户ID的,创建时间戳,一个日期列和一个状态。每个用户ID都有一个创建时间戳、多个日期以及每个日期的不同状态 我需要选择与创建日期之前(或当天)的最新日期相对应的状态。我的数据如下所示: userid creation date status 0001 2014-01-01 03:30:50 2013-01-12 Red 0001 2014-01-01 12:31:12 2011-01-01

我有一个数据框,其中包含
用户ID的
创建
时间戳,一个
日期
列和一个状态。每个用户ID都有一个创建时间戳、多个日期以及每个日期的不同状态

我需要选择与创建日期之前(或当天)的最新日期相对应的状态。我的数据如下所示:

userid    creation               date        status
0001    2014-01-01 03:30:50    2013-01-12    Red
0001    2014-01-01 12:31:12    2011-01-01    Blue
0001    2014-01-01 03:30:50    2014-05-01    Green
0002    2013-12-31 03:30:50    NA            NA
0003    2013-11-11 03:30:50    2013-11-11    Purple
0003    2013-11-11 03:30:50    2012-01-01    Red
创建时间戳和日期都属于
类“POSIXct”“POSIXt”

我不知道该怎么做。我很想使用包
sqldf
,但即使在SQL中,我也不确定如何查询它。数据中也有NA,只是为了让事情更有趣

我发现了一些类似这样的半相关帖子:但没有一篇足够近,可以作为解决方案使用

我想要的一个输出示例是:

userid    initial_status
0001      Red
0002      NA
0003      Purple
在这里,我刚刚将status重命名为initial_status(虽然这不是必需的——它可以称为status)

最近的一次我来了。。。这显然不止一个方面是错误的。。。是


initial_status假设您的数据位于名为
df
的数据帧中:

library(lubridate)
df$creation <- ymd_hms(df$creation)  # convert to date-time
df$date <- ymd(df$date)

library(dplyr)
df %>%
  group_by(userid) %>%  # group by userid
  filter(date <= creation) %>%  # filter by date prior to (or on) creation
  filter(row_number(creation) == 1) %>%  # filter by min creation (see ?row_number)
  select(userid, initial_status = status) # select status variable and rename
库(lubridate)
df$creation%#按用户ID分组
筛选(日期%#按创建前(或创建时)的日期筛选
过滤器(行数(创建)==1)%>%#按最小创建进行过滤(请参见?行数)
选择(userid,initial_status=status)#选择状态变量并重命名
来源:

dat<-"userid    creation    date    status
0001    2014-01-01 03:30:50    2013-01-12    Red
0001    2014-01-01 12:31:12    2011-01-01    Blue
0001    2014-01-01 03:30:50    2014-05-01    Green
0002    2013-12-31 03:30:50    NA    NA
0003    2013-11-11 03:30:50    2013-11-11    Purple
0003    2013-11-11 03:30:50    2012-01-01    Red"
dat<-gsub(pattern = '\\s{4}',',',dat)
dat<-read.table(textConnection(dat),sep = ",",header = T)
dat$creation <-as.POSIXct(dat$creation)
dat$date <- as.POSIXct(dat$date)

你能根据提供的表格提供一个你想要的输出的例子吗?当然,谢谢你的请求谢谢。我几乎可以利用你这里的东西,通过构建它来获得我的解决方案,但是@fxi似乎有一个解决方案,所以我会将他标记为正确的答案。这是使用创建的行号,但是每行的创建都是相同的给定了用户ID,我需要它来查找min(日期),这是啊,我误解了您的需要。我更新了我的答案;但是,它过滤掉了user
0002
,因为他在创建之前没有日期。谢谢,这是一个很好的解决方案。我将投票表决。谢谢!这似乎是一个解决方案,因为它包含了所有必要的逻辑。我感谢你的帮助,并将实现这一点。De nada。如果某件事没有如预期的那样起作用,请不要犹豫,寻求更多帮助:我无法访问你的所有数据,在某些情况下,这个解决方案可能不是最优的。
library(data.table)
# convert to data.table
dat<-as.data.table(dat)
# sort and index
setkey(dat,userid,date,creation)
# ask for the status which have the max date, by userid.
dat2<-dat[date<creation | is.na(date)][,list(statusOut=
                                               if(anyNA(date)){'noValue'
                                               }else{
                                                 as.character(.SD[which.max(date)]$status)
                                               }
                                             ),by='userid']
   userid statusOut
1:      1       Red
2:      2   noValue
3:      3    Purple