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 は、請求 249 が評価された 2 回目である 1980 年 1 月 30 日の日付で請求 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

R Base ソリューション

> 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 に答える