Переписать несколько столбцов на основе разных столбцов

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

У меня есть данные о 120 тысячах человек, с 262 переменными, и мне нужно обновить некоторые столбцы в данных на основе другого набора столбцов. Я перепробовал несколько решений и нашел одно здесь: " Запись столбца фрейма данных на основе нескольких столбцов", но мне нужно сделать это для нескольких столбцов (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

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

Эйб.

1 ответ

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

myColsCheck <- c("x1", "x2")
myColsUpdate <- c("y1", "y2")
for (n in 1:length(myColsCheck)) {
  dat[dat[, myColsCheck[n]] == 2, c(myColsUpdate[n])] <- 8
}
dat
Другие вопросы по тегам