根据日期和r中的其他条件选择行

时间:2020-06-20 07:37:28

标签: r date select

我想根据日期选择特定的客户端会话,但是我不知道该如何处理。我有一个包含所有客户端会话的df,我想制作两个新的df:一个包含每个客户端的第一个会话,另一个包含每个客户端的第二个会话。第一次或第二次会话基于日期。会话ID是随机生成的数字,就像客户端ID一样。

我的数据如下:

Client id     Session id       Date
 8972137        95738        13-03-2019
 8972137        61718        18-03-2019
 8972137        81289        19-03-2019
 8972137        89239        20-03-2019
 56121278       91298        13-02-2019
 56121278       12794        15-02-2019
 56121278       10083        16-02-2019
 13482932       90138        03-02-2019
 13482932       23128        06-02-2019

我想仅通过第一个会话获得df的输出,

Client id     Session id     Date
8972137        95738        13-03-2019
56121278       91298        13-02-2019
13482932       90138        03-02-2019

对于具有第二个会话的df,例如:

Client id     Session id     Date
 8972137        61718        18-03-2019
 56121278       12794        15-02-2019
 13482932       90138        03-02-2019

4 个答案:

答案 0 :(得分:1)

一种baseR方法,

index <- order(mydata[,1])[!duplicated(sort(mydata[,1]))] # Finds first occurance

mydata[index,]

给予

  Clientid Sessionid       Date
1        1     95738 13-03-2019
5        2     91298 13-02-2019
8        3     90138 03-02-2019


mydata[(index+1),]

给予

  Clientid Sessionid       Date
2        1     61718 18-03-2019
6        2     12794 15-02-2019
9        3     23128 06-02-2019

数据:

mydata <- read.table(text="Clientid     Sessionid     Date
    1             95738        13-03-2019
    1             61718        18-03-2019
    1             81289        19-03-2019
    1             89239        20-03-2019
    2             91298        13-02-2019
    2             12794        15-02-2019
    2             10083        16-02-2019
    3             90138        03-02-2019
    3             23128        06-02-2019",header=T)

答案 1 :(得分:1)

我认为您可以使用此功能:

library (dplyr)
date_fun<-function(df, n_slice){
  result<-df %>% 
    group_by(id) %>% 
    arrange(id,Date) %>% 
    slice(n_slice)
  return (result)
}

date_fun(df,1)

# id    session_id Date      
  <fct> <fct>      <date>    
1 1     95738      2019-03-13
2 2     91298      2019-02-13
3 3     90138      2019-02-03

date_fun(df,2)

id    session_id Date      
  <fct> <fct>      <date>    
1 1     61718      2019-03-18
2 2     12794      2019-02-15
3 3     23128      2019-02-06

n_slice是会话数

答案 2 :(得分:0)

这将获取ID的每 i 行,并将其列出到数据帧中。

res <- lapply(unique(dat$Client.id), function(i) 
  do.call(rbind, by(dat, dat$Client.id, function(x) x[i, ])))
res
# [[1]]
#   Client.id Session.id       Date
# 1         1      95738 13-03-2019
# 2         2      91298 13-02-2019
# 3         3      90138 03-02-2019
# 
# [[2]]
#   Client.id Session.id       Date
# 1         1      61718 18-03-2019
# 2         2      12794 15-02-2019
# 3         3      23128 06-02-2019
# 
# [[3]]
#   Client.id Session.id       Date
# 1         1      81289 19-03-2019
# 2         2      10083 16-02-2019
# 3        NA         NA       <NA>

编辑:要“解包”列出的数据框,请在之后使用list2env,并使用setNames给出所需的名称。

list2env(setNames(res, paste0("dat", 1:length(res))), envir=.GlobalEnv)
ls()
# [1] "dat"  "dat1" "dat2" "dat3" "res" 

数据:

dat <- structure(list(Client.id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L), Session.id = c(95738L, 61718L, 81289L, 89239L, 91298L, 12794L, 
10083L, 90138L, 23128L), Date = c("13-03-2019", "18-03-2019", 
"19-03-2019", "20-03-2019", "13-02-2019", "15-02-2019", "16-02-2019", 
"03-02-2019", "06-02-2019")), class = "data.frame", row.names = c(NA, 
-9L))

答案 3 :(得分:0)

这是一种基本的R方法:

#Convert to date
df$Date <- as.Date(df$Date, '%d-%m-%Y')
#Order the dataframe based on Clientid and date
df <- df[with(df, order(Clientid, Date)),]
#Assign session number for each Clientid
df$Session_No <- with(df, ave(Sessionid, Clientid, FUN = seq_along))

现在,您可以subset获取所需的任何会话数据的数据:

subset(df, Session_No == 1)

#  Clientid Sessionid       Date Session_No
#1  8972137     95738 2019-03-13          1
#8 13482932     90138 2019-02-03          1
#5 56121278     91298 2019-02-13          1

subset(df, Session_No == 2)

#  Clientid Sessionid       Date Session_No
#2  8972137     61718 2019-03-18          2
#9 13482932     23128 2019-02-06          2
#6 56121278     12794 2019-02-15          2

数据

df <- structure(list(Clientid = c(8972137L, 8972137L, 8972137L, 8972137L, 
56121278L, 56121278L, 56121278L, 13482932L, 13482932L), Sessionid = c(95738L, 
61718L, 81289L, 89239L, 91298L, 12794L, 10083L, 90138L, 23128L
), Date = c("13-03-2019", "18-03-2019", "19-03-2019", "20-03-2019", 
"13-02-2019", "15-02-2019", "16-02-2019", "03-02-2019", "06-02-2019"
)), class = "data.frame", row.names = c(NA, -9L))