4

我正在使用 R,并且我有一个数据框,其中包含有关个人申请拨款的信息。个人可以根据需要多次申请补助金。我想派生一个新变量,告诉我每个人已经完成了多少申请,包括每条记录所代表的申请日期。

目前我的数据如下所示:

app number  date app made     applicant
1           2012-08-01        John
2           2012-08-02        John
3           2012-08-02        Jane
4           2012-08-04        John
5           2012-08-08        Alice
6           2012-08-09        Alice
7           2012-08-09        Jane

我想添加一个进一步的变量,所以我的数据框看起来像这样:

app number  date app made    applicant  applications by applicant to date
1           2012-08-01       John       1
2           2012-08-02       John       2
3           2012-08-02       Jane       1
4           2012-08-04       John       3
5           2012-08-08       Alice      1
6           2012-08-09       Alice      2
7           2012-08-09       Jane       2

我是 R 新手,我真的很难弄清楚如何做到这一点。我能得到的最接近的答案类似于这个问题的答案: 如何计算 R 中给定间隔的观察次数?

但是我无法根据每条记录中的日期而不是预设的时间间隔来计算如何执行此操作。

4

3 回答 3

5

你可以用plyr这个。如果您的数据在data.framedat 中,我会添加一个名为 count 的列,然后使用cumsum

library(plyr)
dat <- structure(list(number = 1:7, date = c("2012-08-01", "2012-08-02", 
"2012-08-02", "2012-08-04", "2012-08-08", "2012-08-09", "2012-08-09"
), name = c("John", "John", "Jane", "John", "Alice", "Alice", 
"Jane")), .Names = c("number", "date", "name"), row.names = c(NA, 
-7L), class = "data.frame")

dat$count <- 1

ddply(dat, .(name), transform, count=cumsum(count))

  number       date  name count
1      5 2012-08-08 Alice     1
2      6 2012-08-09 Alice     2
3      3 2012-08-02  Jane     1
4      7 2012-08-09  Jane     2
5      1 2012-08-01  John     1
6      2 2012-08-02  John     2
7      4 2012-08-04  John     3
> 

我假设您的日期已经排序,但是您可能希望在进行“计数”之前对它们进行明确排序:

dat <- dat[order(dat$date),]

根据评论,如果您理解(我没有!)这种方式transform的工作原理,这可以简化:

ddply(dat, .(name), transform, count=order(date))
  number       date  name count
1      5 2012-08-08 Alice     1
2      6 2012-08-09 Alice     2
3      3 2012-08-02  Jane     1
4      7 2012-08-09  Jane     2
5      1 2012-08-01  John     1
6      2 2012-08-02  John     2
7      4 2012-08-04  John     3
于 2012-08-14T17:04:46.453 回答
5

这是一种比@Justin 更不优雅的方式:

    A <- read.table(text='"app number"  "date app made"     "applicant"
    1           2012-08-01        John
    2           2012-08-02        John
    3           2012-08-02        Jane
    4           2012-08-04        John
    5           2012-08-08        Alice
    6           2012-08-09        Alice
    7           2012-08-09        Jane',header=TRUE)

    # order by applicant name
    A <- A[order(A$applicant), ]
    # get vector you're looking for
    A$app2date <- unlist(sapply(unique(A$applicant),function(x, appl){
                         seq(sum(A$applicant == x))
                       }, appl = A$applicant)
                     )
    # back in original order:
    A   <- A[order(A$"app.number"), ]
于 2012-08-14T17:10:41.963 回答
5

这是使用该ave功能的 1 行方法。此版本不需要重新排序数据,但保留数据的顺序与原来相同:

A$applications <- ave(A$app.number, A$applicant, FUN=seq_along)
于 2012-08-14T17:50:42.837 回答