根据不同的列重写多个列

时间:2016-05-05 06:49:45

标签: r loops if-statement square-bracket

我的代码有点问题,我解决了它,但现在我想找到一种更有效的方法,因为我有一个肯定的。

我有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

提前谢谢你。 (这是我的第一个问题,请告诉我,如果我做错了什么,或者我没有雄辩或清楚地说出自己的话......)

安倍。

1 个答案:

答案 0 :(得分: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