2016-06-16 21 views
0

注再コーディングするとき:この記事は別のポストに関連している(Recoding longitudinal variables in RRのdata.table:出力異なる値に変わった変数

を私はdata.tableを持っていると私は(homes)変数の値を再コーディングする必要が条件付け他の変数の値に置き換えます。基本的にはmonth == "1"year == "2011"に対応する観測値をmonth == "12"year == "2010"の値にしたいと思います。 data.tableは次のようになります。

> head(test,25) 
         LA month year entry exit total homes 
1: Barking and Dagenham 10 2010  2 0  2 NA 
2: Barking and Dagenham 11 2010  3 0  3 NA 
3: Barking and Dagenham 12 2010  3 0  3 15 
4: Barking and Dagenham  1 2011  6 0  6 NA 
5: Barking and Dagenham  2 2011  1 0  1 NA 
6: Barking and Dagenham  3 2011  2 0  2 NA 
7: Barking and Dagenham  4 2011  1 0  1 NA 
8: Barking and Dagenham 10 2011  1 0  1 NA 
9: Barking and Dagenham 11 2011  1 0  1 NA 
10: Barking and Dagenham  1 2012  1 0  1 NA 
11: Barking and Dagenham  9 2012  1 0  1 NA 
12: Barking and Dagenham  6 2013  2 0  2 NA 
13: Barking and Dagenham  1 2014  0 1 -1 NA 
14: Barking and Dagenham 12 2014  0 1 -1 NA 
15: Barking and Dagenham  3 2015  1 1  0 NA 
16: Barking and Dagenham 11 2015  1 1  0 NA 
17: Barking and Dagenham 12 2015  1 0  1 NA 
18:    Barnet 11 2010 24 0 24 NA 
19:    Barnet 12 2010 28 0 28 86 
20:    Barnet  1 2011 28 0 28 NA 
21:    Barnet  2 2011  6 0  6 NA 
22:    Barnet  3 2011  1 0  1 NA 
23:    Barnet  4 2011  1 0  1 NA 
24:    Barnet  7 2011  2 0  2 NA 
25:    Barnet  8 2011  1 0  1 NA 
         LA month year entry exit total homes 

次のようにこのdata.tableの構造は次のとおりです。

Classes ‘data.table’ and 'data.frame': 4664 obs. of 7 variables: 
$ LA : Factor w/ 151 levels "Barking and Dagenham",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ month: int 10 11 12 1 2 3 4 10 11 1 ... 
$ year : int 2010 2010 2010 2011 2011 2011 2011 2011 2011 2012 ... 
$ entry: int 2 3 3 6 1 2 1 1 1 1 ... 
$ exit : int 0 0 0 0 0 0 0 0 0 0 ... 
$ total: int 2 3 3 6 1 2 1 1 1 1 ... 
$ homes: int NA NA 15 NA NA NA NA NA NA NA ... 

私は新しい変数を作成homes.1homesを再コーディングするために。私は以下のdata.table機能を使用します:

test = test[year== "2011" & month == "1", homes.1 := as.numeric(!is.na(homes)), by = LA] 

test[, homes.1 := ifelse(!is.na(homes.1), 
         test[month == "12" & year == "2010",homes], 
         homes.1), by=LA] 

私は部分的に私が欲しいものを手に入れます。変数homes.1は再コード化されますが、変数の家に対応する値とは異なる値になります。 test見ての最初の25個の観測:

LA month year entry exit total homes homes.1 
1: Barking and Dagenham 10 2010  2 0  2 NA  NA 
2: Barking and Dagenham 11 2010  3 0  3 NA  NA 
3: Barking and Dagenham 12 2010  3 0  3 15  NA 
4: Barking and Dagenham  1 2011  6 0  6 NA  46 
5: Barking and Dagenham  2 2011  1 0  1 NA  NA 
6: Barking and Dagenham  3 2011  2 0  2 NA  NA 
7: Barking and Dagenham  4 2011  1 0  1 NA  NA 
8: Barking and Dagenham 10 2011  1 0  1 NA  NA 
9: Barking and Dagenham 11 2011  1 0  1 NA  NA 
10: Barking and Dagenham  1 2012  1 0  1 NA  NA 
11: Barking and Dagenham  9 2012  1 0  1 NA  NA 
12: Barking and Dagenham  6 2013  2 0  2 NA  NA 
13: Barking and Dagenham  1 2014  0 1 -1 NA  NA 
14: Barking and Dagenham 12 2014  0 1 -1 NA  NA 
15: Barking and Dagenham  3 2015  1 1  0 NA  NA 
16: Barking and Dagenham 11 2015  1 1  0 NA  NA 
17: Barking and Dagenham 12 2015  1 0  1 NA  NA 
18:    Barnet 11 2010 24 0 24 NA  NA 
19:    Barnet 12 2010 28 0 28 86  NA 
20:    Barnet  1 2011 28 0 28 NA  55 
21:    Barnet  2 2011  6 0  6 NA  NA 
22:    Barnet  3 2011  1 0  1 NA  NA 
23:    Barnet  4 2011  1 0  1 NA  NA 
24:    Barnet  7 2011  2 0  2 NA  NA 
25:    Barnet  8 2011  1 0  1 NA  NA 
         LA month year entry exit total homes homes.1 

同様に、homes.1とtestの構造は次のとおりです。

> str(test) 
Classes ‘data.table’ and 'data.frame': 4664 obs. of 8 variables: 
$ LA  : Factor w/ 151 levels "Barking and Dagenham",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ month : int 10 11 12 1 2 3 4 10 11 1 ... 
$ year : int 2010 2010 2010 2011 2011 2011 2011 2011 2011 2012 ... 
$ entry : int 2 3 3 6 1 2 1 1 1 1 ... 
$ exit : int 0 0 0 0 0 0 0 0 0 0 ... 
$ total : int 2 3 3 6 1 2 1 1 1 1 ... 
$ homes : int NA NA 15 NA NA NA NA NA NA NA ... 
$ homes.1: num NA NA NA 46 NA NA NA NA NA NA ... 
- attr(*, ".internal.selfref")=<externalptr> 

それはhomes値に応じて適切にhomes.1の観測を再コーディングされていない理由を私は疑問に思います。期待される出力は次のようになります。

 LA month year entry exit total homes homes.1 
1: Barking and Dagenham 10 2010  2 0  2 NA  NA 
2: Barking and Dagenham 11 2010  3 0  3 NA  NA 
3: Barking and Dagenham 12 2010  3 0  3 15  NA 
4: Barking and Dagenham  1 2011  6 0  6 NA  15 
5: Barking and Dagenham  2 2011  1 0  1 NA  NA 
6: Barking and Dagenham  3 2011  2 0  2 NA  NA 
7: Barking and Dagenham  4 2011  1 0  1 NA  NA 
8: Barking and Dagenham 10 2011  1 0  1 NA  NA 
9: Barking and Dagenham 11 2011  1 0  1 NA  NA 
10: Barking and Dagenham  1 2012  1 0  1 NA  NA 
11: Barking and Dagenham  9 2012  1 0  1 NA  NA 
12: Barking and Dagenham  6 2013  2 0  2 NA  NA 
13: Barking and Dagenham  1 2014  0 1 -1 NA  NA 
14: Barking and Dagenham 12 2014  0 1 -1 NA  NA 
15: Barking and Dagenham  3 2015  1 1  0 NA  NA 
16: Barking and Dagenham 11 2015  1 1  0 NA  NA 
17: Barking and Dagenham 12 2015  1 0  1 NA  NA 
18:    Barnet 11 2010 24 0 24 NA  NA 
19:    Barnet 12 2010 28 0 28 86  NA 
20:    Barnet  1 2011 28 0 28 NA  86 
21:    Barnet  2 2011  6 0  6 NA  NA 
22:    Barnet  3 2011  1 0  1 NA  NA 
23:    Barnet  4 2011  1 0  1 NA  NA 
24:    Barnet  7 2011  2 0  2 NA  NA 
25:    Barnet  8 2011  1 0  1 NA  NA 
         LA month year entry exit total homes homes.1 
+0

私はそれが 'data.table'関数に与えている条件の原因だと思います。最初に 'homes.1'変数を作成する必要があります。 –

+0

サンプルデータを入力すると役立ちます。私の推測では、マージの割り当てを行うことができるということです – Frank

+0

質問を再現できるようにデータセットを作成するためのコードを含める必要があります – jangorecki

答えて

1

あなたは!is.na(homes)を行うときに、それはFALSEを返し、理由year== "2011" & month == "1"表現is.na(homes)戻りTRUE行に対して0を得ます。
次に、論理値を数値に変換する変数homes.1を作成したので、TRUE1に、FALSE0に自動的に変換します。

これは必ずしも問題ではありませんが、これが動作するかどうか、あなたが私に教えてもらえ

test[, homes.1 := ifelse(!is.na(homes.1), 
        test[month == "12" & year == "2010",homes], 
        homes.1), 
     by=LA] 

:あなたは次のようになります。別のステートメントでこれらの0の値を置き換えることができますか?そうであれば、2つの列を単純にマージすることができます。

+1

'.SD'は"ロック "されているので/書くことはできません編集する。 – Frank

+0

私のコメントを編集しました:それはうまくいくのでしょうか?データがなければ何も言い難いです。 – hellter

+0

うん、うん、それはうまくいくかもしれない。ええ、確かめる前に誰かがOPのデータを再現可能な形で提供するまで待たなければなりません。 – Frank

関連する問題