2016-08-17 11 views
1

0ときに最初の観察を交換:私はこのサンプルを有するレベル因子R

data <- structure(list(mmsi = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor"), 
    tr = c(1, 1, 1, 0, 2, 2, 0, 4, 4, 0, 5, 5)), .Names = c("mmsi", 
"tr"), row.names = c(NA, -12L), class = "data.frame") 

Iは各mmsiため、trの前回値とカラムtr内の各0を置き換えます。

この関数は、サンプルに適しています:

for (i in levels(data$mmsi)) { 
data$test <- na.locf(with(data, { is.na(tr) <- tr == 0; tr }), fromLast = FALSE)} 

しかし、私は大きなサンプルを再生するとき、1つの問題はapears:最初の値が0であれば、その後、私は(エラーを持っている、それは見つけることができないので、前の値...)。例えば

私は

data <- structure(list(mmsi = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor"), 
    tr = c(0, 1, 1, 0, 2, 2, 0, 4, 4, 0, 5, 5)), .Names = c("mmsi", 
"tr"), row.names = c(NA, -12L), class = "data.frame") 

で、少量のサンプルを編集した場合、列trは前のサンプルでは0ではなく1でここから始まります。私はその後、同じ機能for (i in levels(data$mmsi)) { data$test <- na.locf(with(data, { is.na(tr) <- tr == 0; tr }), fromLast = FALSE)}を適用した場合、私はもちろん、エラーが発生している

Error in `$<-.data.frame`(`*tmp*`, "test", value = c(1, 1, 1, 2, 2, 2, : 
    replacement has 11 rows, data has 12 

- >

私は私が必要と思います(コラムtrに最初の値)の値Iの変化を置き換えることができなかった機能私の関数では、最初に0を編集する行がtrの最初のレベルとして発生します。新しい行は、0を次の非ゼロ値に置き換える必要があります。その後、残りの機能は正常です。

私はこの新しいコラムを探しています出力は、次のとおりです。

data$test 
[1] 1 1 1 1 2 2 2 4 4 4 5 5 

任意のアイデアはどのようにこれを取得するには?

答えて

1

これは、グループごとの機能の1つで実行できます。 'data.frame'を 'mmsi'でグループ化した 'data.table'(setDT(data))に変換し、 '0'の値を 'NA'に置き換えてna.rm = FALSEの代わりにna.locfzoo)を適用すると、第2のna.locffromLast = TRUEと置き換えて、開始値0(別名NA)を次の値に置き換えます。

library(data.table) 
library(zoo) 
setDT(data)[, test := na.locf(na.locf(replace(tr, tr==0, NA), 
        na.rm=FALSE), fromLast=TRUE), by = mmsi] 
data 
# mmsi tr test 
# 1: a 0 1 
# 2: a 1 1 
# 3: a 1 1 
# 4: a 0 1 
# 5: a 2 2 
# 6: a 2 2 
# 7: a 0 2 
# 8: b 4 4 
# 9: b 4 4 
#10: b 0 4 
#11: b 5 5 
#12: b 5 5 

は、我々はまた、na.locf

setDT(data)[, test := pmax(pmax(tr, shift((NA^!tr) * tr), na.rm = TRUE),1), mmsi] 
+0

グレートを使用せずにこれを行うことができ、それは非常にうまく動作しているようだ(と 'tr'は数値です;))。私は同じ手順を 'for(i in levels(data $ mmsi)){ data $ test = data $ rl [!! data $ rl] [cumsum(!! data $ rl)+1] というデータで取得しようとしました。 fromLast = TRUE(データ、{is.na(テスト)< - テスト== 0;テスト})、$テスト[is.na(データ$テスト)] < - 0 データ$テスト< - na.locf ) 'それはあなたの答えの前にそれを得ていませんでした。ありがとう! – Floni

関連する問題