2013-03-26 11 views
8

この質問は、類似のタイトル(replace NA in an R vector with adjacent values)の投稿に関連しています。私は、データフレーム内の列をスキャンして、NAの値を隣接するセルの値に置き換えたいと考えています。前述のポストでは、解決策は、隣接するベクトル(例えば、データ行列の隣接要素)からの値ではなくNAを置き換えることであったが、固定値のための条件付き置換であった。以下は私の問題の再現可能な例である:列のNAを隣接列の値に置き換えてください。

UNIT <- c(NA,NA, 200, 200, 200, 200, 200, 300, 300, 300,300) 
STATUS <-c('ACTIVE','INACTIVE','ACTIVE','ACTIVE','INACTIVE','ACTIVE','INACTIVE','ACTIVE','ACTIVE', 
        'ACTIVE','INACTIVE') 
TERMINATED <- c('1999-07-06' , '2008-12-05' , '2000-08-18' , '2000-08-18' ,'2000-08-18' ,'2008-08-18', 
         '2008-08-18','2006-09-19','2006-09-19' ,'2006-09-19' ,'1999-03-15') 
START <- c('2007-04-23','2008-12-06','2004-06-01','2007-02-01','2008-04-19','2010-11-29','2010-12-30', 
        '2007-10-29','2008-02-05','2008-06-30','2009-02-07') 
STOP <- c('2008-12-05','4712-12-31','2007-01-31','2008-04-18','2010-11-28','2010-12-29','4712-12-31', 
        '2008-02-04','2008-06-29','2009-02-06','4712-12-31') 

TEST < - data.frame(UNIT、STATUS、TERMINATED、START、STOP) TEST

UNIT STATUS TERMINATED  START  STOP 
1 NA ACTIVE 1999-07-06 2007-04-23 2008-12-05 
2 NA INACTIVE 2008-12-05 2008-12-06 4712-12-31 
3 200 ACTIVE 2000-08-18 2004-06-01 2007-01-31 
4 200 ACTIVE 2000-08-18 2007-02-01 2008-04-18 
5 200 INACTIVE 2000-08-18 2008-04-19 2010-11-28 
6 200 ACTIVE 2008-08-18 2010-11-29 2010-12-29 
7 200 INACTIVE 2008-08-18 2010-12-30 4712-12-31 
8 300 ACTIVE 2006-09-19 2007-10-29 2008-02-04 
9 300 ACTIVE 2006-09-19 2008-02-05 2008-06-29 
10 300 ACTIVE 2006-09-19 2008-06-30 2009-02-06 
11 300 INACTIVE 1999-03-15 2009-02-07 4712-12-31 

#using the syntax for a conditional replace and hoping it works :/   
TEST$UNIT[is.na(TEST$UNIT)] <- TEST$STATUS; TEST 

    UNIT STATUS TERMINATED  START  STOP 
1  1 ACTIVE 1999-07-06 2007-04-23 2008-12-05 
2  2 INACTIVE 2008-12-05 2008-12-06 4712-12-31 
3 200 ACTIVE 2000-08-18 2004-06-01 2007-01-31 
4 200 ACTIVE 2000-08-18 2007-02-01 2008-04-18 
5 200 INACTIVE 2000-08-18 2008-04-19 2010-11-28 
6 200 ACTIVE 2008-08-18 2010-11-29 2010-12-29 
7 200 INACTIVE 2008-08-18 2010-12-30 4712-12-31 
8 300 ACTIVE 2006-09-19 2007-10-29 2008-02-04 
9 300 ACTIVE 2006-09-19 2008-02-05 2008-06-29 
10 300 ACTIVE 2006-09-19 2008-06-30 2009-02-06 
11 300 INACTIVE 1999-03-15 2009-02-07 4712-12-31 

結果は次のようになります。

 UNIT STATUS TERMINATED  START  STOP 
1 ACTIVE ACTIVE 1999-07-06 2007-04-23 2008-12-05 
2 INACTIVE INACTIVE 2008-12-05 2008-12-06 4712-12-31 
3  200 ACTIVE 2000-08-18 2004-06-01 2007-01-31 
4  200 ACTIVE 2000-08-18 2007-02-01 2008-04-18 
5  200 INACTIVE 2000-08-18 2008-04-19 2010-11-28 
6  200 ACTIVE 2008-08-18 2010-11-29 2010-12-29 
7  200 INACTIVE 2008-08-18 2010-12-30 4712-12-31 
8  300 ACTIVE 2006-09-19 2007-10-29 2008-02-04 
9  300 ACTIVE 2006-09-19 2008-02-05 2008-06-29 
10  300 ACTIVE 2006-09-19 2008-06-30 2009-02-06 
11  300 INACTIVE 1999-03-15 2009-02-07 4712-12-31 
+0

多分try $ UNIT [is.na(TEST $ UNIT)] < - TEST $ STATUS [is.na(TEST $ UNIT)]; TEST ' – Seth

+2

データフレームの列内に型を混在させることはできません。 –

答えて

12

ステータスが要因であったため、動作しませんでした。係数を数値と混合すると、数値は最も制限の少ないものになります。文字としてのステータスを強制することによって、あなたはあなたが後にしている結果を得ると、列は現在、文字ベクトルである:あなたは値が置き換えられますので、

TEST$UNIT[is.na(TEST$UNIT)] <- TEST$STATUS[is.na(TEST$UNIT)] 

をしなければならない

TEST$UNIT[is.na(TEST$UNIT)] <- as.character(TEST$STATUS[is.na(TEST$UNIT)]) 

##  UNIT STATUS TERMINATED  START  STOP 
## 1 ACTIVE ACTIVE 1999-07-06 2007-04-23 2008-12-05 
## 2 INACTIVE INACTIVE 2008-12-05 2008-12-06 4712-12-31 
## 3  200 ACTIVE 2000-08-18 2004-06-01 2007-01-31 
## 4  200 ACTIVE 2000-08-18 2007-02-01 2008-04-18 
## 5  200 INACTIVE 2000-08-18 2008-04-19 2010-11-28 
## 6  200 ACTIVE 2008-08-18 2010-11-29 2010-12-29 
## 7  200 INACTIVE 2008-08-18 2010-12-30 4712-12-31 
## 8  300 ACTIVE 2006-09-19 2007-10-29 2008-02-04 
## 9  300 ACTIVE 2006-09-19 2008-02-05 2008-06-29 
## 10  300 ACTIVE 2006-09-19 2008-06-30 2009-02-06 
## 11  300 INACTIVE 1999-03-15 2009-02-07 4712-12-31 
+0

私より6秒早くなります。 +1(私は私を削除しています)。 – A5C1D2H2I1M1N2O1R2T1

+2

コードとピストルではなく、良いことでした:) –

+0

ありがとうございました!そのトリックをした –

2

隣接値。それ以外の場合は、置き換えられる値の数とそれらを置き換える値の間に不一致があります。これにより、値が行順に置き換えられます。置換される2つの値が最初の2つであるため、この場合に機能します。

+0

これは答えとしてOKだと思います。確かに、解決策は他の人の解答と同じですが、何が起こっているのかの説明を追加しました。私の意見では、コメントではないはずです。 –

関連する問題