0

我有一个如下所示的数据框(但要大得多)

df<-data.frame(Claim=c("117","249","117","117","249","652"),ValuationDate=c("01/05/1965","01/05/1980","01/10/1965","01/20/1965","01/30/1980","01/10/1990"))

df
  Claim ValuationDate
1   117    01/05/1965
2   249    01/05/1980
3   117    01/10/1965
4   117    01/20/1965
5   249    01/30/1980
6   652    01/10/1990

我想添加一列“ValuationNumber”,对于每个索赔的最早估价日期为 1,并为每个后续估价日期(对于每个索赔)增加 1。例如,第 5 行的 ValuationNumber 为 2,因为第 5 行描述了 1980 年 1 月 30 日的索赔 249,这是第二次评估索赔 249。的完整输出df看起来像

df
  Claim ValuationDate  ValuationNumber
1   117    01/05/1965   1
2   249    01/05/1980   1
3   117    01/10/1965   2
4   117    01/20/1965   3
5   249    01/30/1980   2
6   652    01/10/1990   1

添加我需要的列的有效方法是什么?

4

5 回答 5

2

这与这个 data.table问题非常相似:

library(data.table)
dt = data.table(df)

dt[, ValuationNumber := 1:.N, by = Claim]
dt
#   Claim ValuationDate ValuationNumber
#1:   117    01/05/1965               1
#2:   249    01/05/1980               1
#3:   117    01/10/1965               2
#4:   117    01/20/1965               3
#5:   249    01/30/1980               2
#6:   652    01/10/1990               1
于 2013-07-08T20:27:34.173 回答
2

R 基础解决方案

> transform(df, ValuationNumber=ave(rep(1,nrow(df)), df$Claim, FUN=seq))
  Claim ValuationDate ValuationNumber
1   117    01/05/1965               1
2   249    01/05/1980               1
3   117    01/10/1965               2
4   117    01/20/1965               3
5   249    01/30/1980               2
6   652    01/10/1990               1
于 2013-07-08T21:58:41.790 回答
1

使用plyr

ddply(df, "Claim", function(d) { d$ValuationNumber <- seq_along(d$Claim); d})

这也会破坏秩序。

于 2013-07-08T21:03:38.070 回答
0

您可以通过按日期拆分、添加新列并重建 df 来做到这一点:

out <- lapply(split(df,df$Claim), function(x) {
    ValuationNumber <- 1:dim(x)[1]
    cbind(x,ValuationNumber)
})
dfout <- do.call(rbind, out)

并且可以选择按日期排序(但最好先转换为日期类,以便按实际时间顺序排列):

dfout[order(dfout$ValuationDate),]

结果:

      Claim ValuationDate ValuationNumber
117.1   117    01/05/1965               1
249.2   249    01/05/1980               1
117.3   117    01/10/1965               2
652     652    01/10/1990               1
117.4   117    01/20/1965               3
249.5   249    01/30/1980               2
于 2013-07-08T20:03:47.553 回答
0

如果这是在一个已知在索赔编号内排序的数据集上完成的,那么它会很简单:

df$ValuationNumber <- ave( 
 as.numeric(as.Date( as.character(df$ValuationDate), format="%m/%d/%Y")), 
 df$Claim, 
 FUN=seq_along)  # actually turned out to be some what not-easy.

如果不保证排序,您首先需要按日期排序,此时您有一个非日期版本的 ValuationDate。

 df <- df[order( 
          as.Date( as.character(df$ValuationDate), 
                              format="%m/%d/%Y")) , ]
 df$ValuationNumber <- ave( 
     as.numeric(as.Date( as.character(df$ValuationDate), format="%m/%d/%Y")), 
     df$Claim, 
     FUN=seq_along)
于 2013-07-09T00:12:47.927 回答