根据同一个人的上次观察添加列

时间:2016-08-31 14:42:38

标签: r data.table

我这里有一些人工数据。可以想象这些是个人的访问。

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 visitIs 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

1 个答案:

答案 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。

编辑:类似于DataTable答案的版本

new.df <- group_by(df, id) %>%
    arrange(date) %>% 
    mutate(
        last.visit = date[n()],
        last.score = score[n()],
        last.happy = happy[n()]
    )