2017-04-04 8 views
0

一定期間にわたって1人あたり複数の観測値を持つデータセットを変換しようとしています。例えば、この時間中、人1は肥満であり、肥満ではない(ちょうど太りすぎる)ことができる。ここでは、人1からの例です:グループ/ IDで特定の列の最大値に置き換えます。

ID  Obese  Overweight 
1  NA   NA 
1  NA   NA 
1  0   1 
1  1   0 
1  0   0 
2  NA   0 
2  0   1 
2  0   NA 

I 1は(700 +がある指定された列数を越え、THAT列内のすべての表示された場合は、各列に「1」の値を交換する必要がある。例えば、 c(5:749))by "ID"。理想的には、出力は次のようになります。

ID  Obese  Overweight 
1  1   1 
1  1   1 
1  1   1 
1  1   1 
1  1   1 
2  0   1 
2  0   1 
2  0   1 

まず、すべてのNAsを0に変更しました。私は、各列に沿って最大値を取って(IDで)置き換えることができると考えましたが、グループ(ID)と列(c(5:749) )。また、新しい列を作成するのではなく、データフレーム内にすでに存在する列内の値を置換するだけです。

私はループが長すぎる与えかかるだろうと思います。また

​​

...それは単一の変数のために働くようになったが、変数のセットを通過するループにこれを変換できませんでした。データサイズその他の推奨事項はありますか?前もって感謝します。ここでは例のデータセットがあります:

dat <- as.data.frame(matrix(NA,18)) 
dat$id <- as.character(c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3)) 
dat$ob1 <- as.character(c(NA,NA,0,1,0,NA,0,1,0,0,0,0,0,0,0,0,0,0)) 
dat$ob2 <- as.character(c(NA,NA,1,0,0,NA,0,0,1,0,0,0,0,1,0,0,0,0)) 
dat <- dat[,-1] 

は限りリンクとして「lapply」を使用してページング、与えられた個々のすべての値がNA(または0)の場合に動作するようには思えません。このシナリオでは、他の列(元のデータセットの列には現れなかった列)の値を「記入」/置き換えているようです。これは、バイナリ変数が連続値で代入/置換されたときにはっきりと検出されました。なぜこれが起こっているかもしれないのか?

+0

は、コメントでより多くのオプションを見ることができます。 – Frank

+0

このページをリンクありがとうございます。私が探しているもののようですが、まだエラーが発生しています。たとえば、特定の個体ですべての値がNAである列では、他の列(元のデータセットの列には現れなかった列)から始まる値を「記入」/置き換えているようです。これは、バイナリ変数が連続値で代入/置換されたときにはっきりと検出されました。なぜこれが起こっているかもしれないのか? – mgianfra

+0

さて、あなたはそれを示す例を投稿することができますか?私は説明されている事実を本当に理解していません。 – Frank

答えて

1

私はtapplyがこの場合に役立つと思います。 あなたが

with(dat, tapply(ob1, id, max)) 

によって各IDの最大を見つけることができます私のソリューションです:リンク質問に

dat$ob1 <- as.numeric(dat$ob1) 
dat$ob2 <- as.numeric(dat$ob2) 
dat[is.na(dat)] <- 0 

dat$ob1 <- with(dat,tapply(ob1,id,max)[id]) 
dat$ob2 <- with(dat,tapply(ob2,id,max)[id]) 

dat 
    id ob1 ob2 
1 1 1 1 
2 1 1 1 
3 1 1 1 
4 1 1 1 
5 1 1 1 
6 1 1 1 
7 2 1 1 
8 2 1 1 
9 2 1 1 
10 2 1 1 
11 2 1 1 
12 2 1 1 
13 3 0 1 
14 3 0 1 
15 3 0 1 
16 3 0 1 
17 3 0 1 
18 3 0 1 
+1

ありがとうございますが、各変数を指定することなくこれを行う方法はありますか?たとえば、私は何百ものカラムを持っており、それぞれに対してtapplyコマンドを実行可能に書くことはできません。たとえば、5:749のようにコマンドを実行するためにこのコードを書くにはどうすればよいですか? – mgianfra

関連する問題