将变量中的值设置为NA,以另一个变量为条件

Phi*_*hil 3 r conditional-operator dataframe na

如果满足另一个变量的条件,我想删除变量中的值.例如:

df$var1[df$condvar == 0] <- NA
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常,但我需要重复这个几十更多的变数,所以var1上面会改变var2,var3等等.这始终是基于相同的condvar,虽然对于这些变量的一半条件df$condvar == 1.一遍又一遍地重复这一行是很麻烦的,我想知道是否有更简洁的方法来编写代码.其中一个apply功能会帮助,还是需要创建自定义功能?

作为一个可重复的例子,我希望避免下面代码的重复性:

ex <- mtcars
ex$mpg[ex$vs == 0] <- NA
ex$disp[ex$vs == 0] <- NA
ex$drat[ex$vs == 0] <- NA
ex$cyl[ex$vs == 1] <- NA
ex$hp[ex$vs == 1] <- NA
ex$wt[ex$vs == 1] <- NA
ex


                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4             NA   6    NA 110   NA 2.620 16.46  0  1    4    4
Mazda RX4 Wag         NA   6    NA 110   NA 2.875 17.02  0  1    4    4
Datsun 710          22.8  NA 108.0  NA 3.85    NA 18.61  1  1    4    1
Hornet 4 Drive      21.4  NA 258.0  NA 3.08    NA 19.44  1  0    3    1
Hornet Sportabout     NA   8    NA 175   NA 3.440 17.02  0  0    3    2
Valiant             18.1  NA 225.0  NA 2.76    NA 20.22  1  0    3    1
Duster 360            NA   8    NA 245   NA 3.570 15.84  0  0    3    4
etc.
Run Code Online (Sandbox Code Playgroud)

如果有一行代码适用于所有变量condvar == 0而另一行适用于那些变量,我会非常高兴condvar == 1.

the*_*ail 5

这是一次希望不太复杂的尝试.如果您设置vars要循环,并values希望选择相应的索引,则可以执行以下操作:

vars   <- c("mpg", "disp", "cyl", "hp")
values <- c(0, 0, 1, 1)

ex[vars] <- Map(function(x,y) replace(x, ex$vs == y, NA), ex[vars], vals)

#                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#Mazda RX4             NA   6    NA 110 3.90 2.620 16.46  0  1    4    4
#Mazda RX4 Wag         NA   6    NA 110 3.90 2.875 17.02  0  1    4    4
#Datsun 710          22.8  NA 108.0  NA 3.85 2.320 18.61  1  1    4    1
#Hornet 4 Drive      21.4  NA 258.0  NA 3.08 3.215 19.44  1  0    3    1
#Hornet Sportabout     NA   8    NA 175 3.15 3.440 17.02  0  0    3    2
#Valiant             18.1  NA 225.0  NA 2.76 3.460 20.22  1  0    3    1
# ...
Run Code Online (Sandbox Code Playgroud)

如果你只有两个组,你可以通过注释中提到的@HubertL和@Phil等几个赋值更简单,但是使用Map允许你考虑许多带有许多可能索引值的变量,而不会超过3行码.