我这里有一些人工数据。可以想象这些是个人的访问。
n <- 10e4
set.seed(1)
df <- data.frame(id = sample(1:(n/4), n, replace = TRUE),
date = as.Date("1982-03-03") +
sample(1:900, n, replace = TRUE),
score = runif(n, 0, 10),
happy = sample(c("Yes", "No"), n, replace = TRUE))
head(df, 4)
id date score happy
1 6638 1983-11-24 7.856568 Yes
2 9304 1983-11-25 5.254272 No
3 14322 1982-12-10 6.525329 Yes
4 22706 1983-07-14 7.551247 No
我想做的是添加三列。 Date of most recent visit
(即t-1),Score of last visit
和Is happy at most recent visit?
。
最终目标是查看Score of most recent visit
是否可以预测Is happy at most recent visit?
当前访问控制中的幸福状态以及两次访问的时间差。
以下是我的开始:转换为data.table
并对访问进行排名。
setDT(df)[, date := as.IDate(date)]
df[order(date), visit.n := 1:.N, by=id]
head(df, 4)
id date score happy visit.n
1: 6638 1983-11-24 7.856568 Yes 5
2: 9304 1983-11-25 5.254272 No 4
3: 14322 1982-12-10 6.525329 Yes 2
4: 22706 1983-07-14 7.551247 No 4
所需输出的示例:
id date score happy visit.n last.date last.score last.happy
1: 6638 1983-11-24 7.856568 Yes 5 1983-10-29 8.417868 Yes
2: 9304 1983-11-25 5.254272 No 4 1983-09-04 1.290718 No
3: 14322 1982-12-10 6.525329 Yes 2 1982-08-18 3.546896 No
4: 22706 1983-07-14 7.551247 No 4 1983-04-20 8.560386 No
答案 0 :(得分:0)
您的示例缺少一些关键细节,但如果我正确理解您,则应该可以使用 dplyr 执行此操作:
library(dplyr)
new.df <- group_by(df, id) %>%
mutate(
last.visit = max(date),
last.score = unique(score[date == max(date)]),
last.happy = unique(happy[date == max(date)])
)
将df
分组为&#34; id&#34;,并找到每个id的最大(即最后)日期以及相应的分数和幸福标记。请注意,它依赖于&#34; date&#34;列被格式化为正确的Date
s。
new.df <- group_by(df, id) %>%
arrange(date) %>%
mutate(
last.visit = date[n()],
last.score = score[n()],
last.happy = happy[n()]
)