2016-05-05 9 views
0

私はコードに問題がありますが、解決しましたが、今は効率的な方法を探しています。異なる列に基づいて複数の列を書き直す

私は120K人のデータと262の変数を持っており、別の列のセットに基づいてデータの一部の列を更新する必要があります。 私は複数の解決策を試してみましたが、ここでは 'Recoding data frame column based on multiple columns' が見つかりましたが、複数の列(自分のデータでは6)に対してこれを2回実行する必要があります。私は、私の経験では間違いの大きな原因であるまったく同じことを行う12行を書き込むよりも、これを実行するより良い方法があることを期待しています。

dat <- data.frame(
    "x1" = c(1,0,2,0,5,3,2), 
    "y1" = c(12,14,13,14,12,11,13), 
    "x2" = c(3,2,0,1,2,5,3), 
    "y2" = c(11,13,14,12,13,12,11) 
) 
dat 

# 1st try. works slowly 
for(i in 1:nrow(dat)){ 
    if(dat$x1[i] == 2){dat$y1 <- 8} 
    if(dat$x2[i] == 2){dat$y2 <- 8} 
} 

# 2nd try. doesn't work. (Tried multiple variation) 
dat$y1 <- ifelse(dat$x1 == 2,dat$y1 <- 8,dat$y1) 

# 3rd try. works efficiently, but annoying as hell to code. 
dat$y1[dat$x1 == 2] <- 8 
dat$y2[dat$x2 == 2] <- 8 

ありがとうございます。 (これは私の最初の質問です。私が間違ったことをしたかどうか、または私が雄弁に、または明確にフレーズを演奏しなかったかどうか教えてください...)

安倍。

答えて

0

あなたの質問が正しく理解できれば、同じコードを何度も繰り返したくないです。これを実現するために、あなたがこのようなループでそれをラップすることができます:あなたは...私の問題はR..seemsの間違ったでループのための固有の嫌いがあるやった私がした最後に

myColsCheck <- c("x1", "x2") 
myColsUpdate <- c("y1", "y2") 
for (n in 1:length(myColsCheck)) { 
    dat[dat[, myColsCheck[n]] == 2, c(myColsUpdate[n])] <- 8 
} 
dat 
+0

を...ありがとう! ! – abe05254

+0

ループのメタデータ(列など)がそれほど悪くはありません。通常、データのループは悪いです。 – Bulat

+0

私のメタデータ(あなたが私に教えてくれた新しい言葉を愛しています..)が31,000人の行を超えています...それは理想的ではありません... – abe05254

関連する問題