人IDでキーが設定されていますが、多くのヌル値を持つカラムがたくさんあります(〜150)。各列は記録された状態/属性で、私は各人物のために持ち越したいと思っています。各人には10〜10,000人の観察があり、セットには約50万人がいます。 1人の人からの価値は、次の人には「出血」することができないので、私の解決策は人物IDの列とグループを適切に尊重しなければなりません。デモンストレーションの目的のためには、1つのRデータテーブル内のグループによって効率的にロケートされます。
- ここでは非常に小さなサンプル入力です:
DT = data.table(
id=c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3),
aa=c("A", NA, "B", "C", NA, NA, "D", "E", "F", NA, NA, NA),
bb=c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
cc=c(1, NA, NA, NA, NA, 4, NA, 5, 6, NA, 7, NA)
)
それは次のようになります。
id aa bb cc
1: 1 A NA 1
2: 1 NA NA NA
3: 1 B NA NA
4: 1 C NA NA
5: 2 NA NA NA
6: 2 NA NA 4
7: 2 D NA NA
8: 2 E NA 5
9: 3 F NA 6
10: 3 NA NA NA
11: 3 NA NA 7
12: 3 NA NA NA
私の予想出力は次のようになります。
id aa bb cc
1: 1 A NA 1
2: 1 A NA 1
3: 1 B NA 1
4: 1 C NA 1
5: 2 NA NA NA
6: 2 NA NA 4
7: 2 D NA 4
8: 2 E NA 5
9: 3 F NA 6
10: 3 F NA 6
11: 3 F NA 7
12: 3 F NA 7
私は」私の大規模なデータセットでは非常に遅いです:012 data.table
解決策を見つけました。
DT[, na.locf(.SD, na.rm=FALSE), by=id]
dplyrを使用して同等の解決策を見つけましたが、これは同じように遅いです。
GRP = DT %>% group_by(id)
data.table(GRP %>% mutate_each(funs(blah=na.locf(., na.rm=FALSE))))
私はローリング「自己」data.table
機能を使用して参加を考え出すことができることを期待しましたが、私はちょうど(私はちょうど私が.N
を使用する必要があります容疑者が、私右のそれを得るように見えることはできませんそれを理解していない)。
ここでは、グループ化されたlocfを効率的に適用するためにRcppに何かを書く必要があると考えています。
私はRの新人ですが、私はC++には新しくないので、私はそれができると確信しています。 data.table
を使ってRでこれを行う効率的な方法があるはずです。
私は 'DTかなり確信している[、lapply(.SD、na.locf、F)は、= idで]'私は実際にその使用を開始 – eddi
速くなりますパフォーマンスが悪いことが判明しました。 –
ローリング・セルフ・ジョインがここにあるように見えますが、「na.locf」とローリング・ジョインの両方の回答を覚えていますので、現在の知識ベースで答えが見つかるかもしれません。 – jangorecki