2016-05-05 6 views
0

У меня проблема с моим кодом, я решил это, но теперь я хочу найти более эффективный способ сделать это, так как я уверен, что есть один.переписывание нескольких столбцов на основе разных столбцов

У меня есть данные 120K людей с 262 переменными, и мне нужно обновить некоторые столбцы в данных на основе другого набора столбцов. Я пробовал несколько решений и нашел один здесь 'Recoding data frame column based on multiple columns' , но мне нужно сделать это с несколькими столбцами (6 в моих данных) дважды. Я надеюсь, что есть лучший способ сделать это, чем написать 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 

Заранее спасибо. (это мой первый вопрос, скажите, пожалуйста, если я сделал что-то не так, или если бы я не красноречиво или четко не формулировал себя ...)

Abe.

ответ

0

Если я правильно понял ваш вопрос, вы не хотите повторять один и тот же код несколько раз. Для достижения этой цели вы можете обернуть его в петле, как это:

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

В конце концов, я сделал то, что ты сделал ... Моя проблема врожденной нелюбви петель в R..seems неправильно ... Спасибо! ! – abe05254

+0

Циклы с метаданных (например, столбцы) не так уж плохи. Обычно петли над данными являются плохими. – Bulat

+0

мои метаданные (ЛЮБОВЬ новое слово, которое вы только что научили меня ..) идет по строкам ... 31 000 из них ... это не идеально ... – abe05254