2016-08-31 6 views
0

私はここにいくつかの人工データを持っています。これらは個人の訪問であると想像することができます。同じ個体の最後の観測に基づいて列を追加します

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 

私がしたいことは、3つの列を追加することです。 Date of most recent visit(すなわち、t-1)、Score of last visitおよびIs happy at most recent visit?である。

最後の目標は、Is happy at most recent visit?の現在の訪問制御で幸福の状態を予測でき、2回の訪問がどれほど近いかを見ることです。

以下は私が始めたものです: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

'COLS = cで( "日付"、 "スコア"、 "幸せ"); df [order(date)、sprintf( "last。%s"、cols):= shift(.SD)、by = id、.SDcols = cols] '私は二重引用符を見つけることができるかどうかを調べる。 – Frank

+0

ブラボ@フランク。問題は解決したようだ。以下の2つの答えは私の意図を誤解しています(おそらく私のせいです)。 – snoram

+0

代わりに '.SDcols = date:happy'を使うことができます。 – lmo

答えて

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)]) 
       ) 

"id"でdfをグループ化し、最大(すなわち、最後の)日付と対応するスコアと幸福のフラグを見つけます各IDごとに「日付」列は、適切な形式の「Date」に依存していることに注意してください。

編集:DataTableの答えに似バージョン

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

あなたは正しいです、キーの詳細は(まだですか?)不明です。最後はあいまいなので、「最近の」に変更しました。あなたがしたことは残念ながら私が目指していたものではありません。 – snoram

+0

'max'を使用すると、idごとに最新の日付だけが返されます。 – jdobres

+0

「v-1」からの情報によって、訪問「v」の幸福状態を予測したい。あなたのコードは私にエラーメッセージを表示します: 'エラー:互換性のないサイズ(2)、4(グループサイズ)または1を期待する ' – snoram

関連する問題