我想根据日期选择特定的客户端会话,但是我不知道该如何处理。我有一个包含所有客户端会话的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
答案 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))