Переписать несколько столбцов на основе разных столбцов
У меня есть небольшая проблема с моим кодом, я решил ее, но теперь я хочу найти более эффективный способ сделать это, так как я уверен, что есть один.
У меня есть данные о 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