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

R 以另一个变量为条件,将变量中的值设置为NA,r,dataframe,na,conditional-operator,R,Dataframe,Na,Conditional Operator,如果满足另一个变量的条件,我希望删除变量中的值。例如: df$var1[df$condvar == 0] <- NA 如果有一行代码适用于condvar==0的所有变量,另一行代码适用于condvar==1的变量,我会非常高兴。请尝试: ifelse(df$var1 == 0, NA, df$var1) 这里有一个尝试,希望不会太复杂。如果设置了要循环的vars,以及要为索引选择的相应值,则可以执行以下操作: vars <- c("mpg", "disp", "cyl", "

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

df$var1[df$condvar == 0] <- NA
如果有一行代码适用于
condvar==0
的所有变量,另一行代码适用于
condvar==1
的变量,我会非常高兴。请尝试:

ifelse(df$var1 == 0, NA, df$var1)

这里有一个尝试,希望不会太复杂。如果设置了要循环的
vars
,以及要为索引选择的相应
值,则可以执行以下操作:

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
# ...

vars当
函数运行时,使用新的实验性
case\u的dplyr方法将类似于:

require(dplyr)

ex <- mtcars
ex <- ex %>%
      mutate(mpg  = case_when(.$vs==0 ~ as.double(NA), TRUE ~ .$mpg)) %>%
      mutate(disp = case_when(.$vs==0 ~ as.double(NA), TRUE ~ .$disp)) %>%
      mutate(cyl  = case_when(.$vs==1 ~ as.double(NA), TRUE ~ .$cyl)) %>%
      mutate(hp   = case_when(.$vs==1 ~ as.double(NA), TRUE ~ .$hp))
由于@HubertL(欢迎他将此作为答案发布,我将向上投票)和@smci:

ex[ex$vs == 0, c("mpg", "disp", ...)] <- NA
ex[ex$vs == 1, c("cyl", "hp", ...)] <- NA

ex[ex$vs==0,c(“mpg”,“disp”,…)]
df$var1[df$condvar==0,c(“var1”,“var2”,…)]这不起作用。我不明白
,c(“var1”、“var2”,…)
部分代码是如何工作的。@Phil:HubertL的意思是
df[df$condvar==0,c(“var1”、“var2”,…)]@smci确实如此。您删除的答案需要修改,但指向了正确的方向。@HubertL您应该将您的方法作为答案发布。这比建议的要好(更清楚)。这并不能真正回答问题。我仍然需要反复重复同一行。也许我问题中的
mtcars
示例有助于进一步理解。条件变量实际上并没有改变,只改变了条件(0或1)。我想更改的变量在每行中都不同。@Phil-编辑过,希望与编辑过的问题相匹配。这也很有效,我喜欢它可以更一般化。我永远也不会想到这一点<要避免使用code>dplyr::filter()
,它将根据vs上的拆分对行重新排序
ex <- rbind(ex %>% filter(vs==0) %>% mutate(mpg=NA, disp=NA),
            ex %>% filter(vs==1) %>% mutate(cyl=NA, hp=NA) )
ex[ex$vs == 0, c("mpg", "disp", ...)] <- NA
ex[ex$vs == 1, c("cyl", "hp", ...)] <- NA