2016-04-28 9 views
0

私は184のobsを持つデータフレームを持っていました。 5つの変数の:最初の値を見つけ、その結果に基づいて新しい変数を作成します

今私は発症状況を判断して、新たな変数(挑発)を作成したい:

'data.frame': 184 obs. of 5 variables: 
    $ Cat  : Factor w/ 10 levels "99-001","99-002",..: 1 1 1 1 1 1 1 1 1 1 ... 
    $ No  : int 1 1 1 1 1 1 1 1 1 1 ... 
    $ ehs  : int 0 0 0 0 0 0 0 0 0 0 ... 
    $ Onset : int 0 0 0 0 0 0 0 9 9 9 ... 
    $ STARTING: Factor w/ 149 levels "1:37PM1","1:42PM1",..: 3 4 5 63 64 65 66 67... 

データフレームを繰り返し測定の研究から来て、それは、それぞれのケースが複数回測定した意味それぞれの場合の開始が "0"の場合は、新しい変数(provoke)よりも "0"、それ以外の場合は "1"とコード化されます。
鉱山のRスクリプト:大型ケース番号については

no1 <- seq[seq$No == 1, ] 
if (no1[1,4]==0) {no1$provoke =0} else {no1$provoke =1} 
no2 <- seq[seq$No == 2, ] 
if (no2[1,4]==0) {no2$provoke = 0} else {no2$provoke = 1}  

は、私が仕事に

for (i in 1:10) {  
noi <- seq[seq$No == i, ]  
if (noi[1,4]==0) {  
noi$provoke = 0}  
else {noi$provoke = 1}  
} 

を完了するためにループを記述するつもりが、ループが機能していないようです。バグを見つけたり、間違いを指摘してもらえますか?

+0

'noi 'はおそらく' no [i] 'で、' noi [1,4] 'はおそらく' no [i、4] 'でしょう。いずれにしても、これをコンソールに入力すると、ヘルプページを読むことができます。 '?\' [\ '' –

+0

もちろん、forループを使用しないでください。ベクトル化されたソリューションははるかに高速です。 – Roland

+0

は暗いところで(再現可能なデータなしで)撮影されましたが、ここでは解決策があります: 'df $ provoke < - sapply(1:nrow(df)、function(x)ifelse(df [x、" Onset " 0、1) ' –

答えて

1

seqは、data.frameには本当に悪い名前です。この例ではxyとしましょう。

xy <- data.frame(case = rep(1:5, each = 10), oldvar = rbinom(50, size = 1, prob = 0.5)) 

xy.split <- split(xy, f = xy$case) 

manipulateXY <- function(x) { 
    if (x[1, "oldvar"] == 0) { 
    x$newvar <- 0 
    } else { 
    x$newvar <- 1 
    } 
    x 
} 

xy.newvar <- lapply(xy.split, FUN = manipulateXY) 

xy.new <- do.call("rbind", xy.newvar) 
xy.new 

これについてもう1つの方法は次のとおりです。これは、データの順序がcaseであることを前提としています。

# find first occurrence 
zero.or.not <- do.call("rbind", lapply(xy.split, FUN = function(x) x[1, ]))$oldvar 

# count number of rows 
num.rows <- unlist(lapply(xy.split, FUN = nrow)) 

xy.new$newvar2 <- rep(zero.or.not, times = num.rows) 
xy.new 
+0

スクリプトを試してみましたが、本当にうまくいったのですが、私も関数splitを学びました。中かっこの前に最後のコード "x"について "manipulateXY"私はRに精通していることを学ぶことがたくさんあると思います。「ループ」や「機能」を学ぶための提案をしてもらえますか?将来あなたのような人を助けてくれることを願っています。 –

関連する問題