根据多个条件替换 data.frame 上的值

Replacing a value on a data.frame based on multiple conditions

这在某种程度上是对之前 question 的跟进,其中的想法是根据多个条件替换 data.frame 中的给定值。

这是一个有效的简单示例,基数为 R:

df <- data.frame( var1=c("k",2,NA,6,5,"K","k",1),
              var2=c(4,2,6,0,9,1,3,2),
              var3=c("d","d","d","d","d","d","n","f"))
df

    var1 var2 var3
1    k    4    d
2    2    2    d
3 <NA>    6    d
4    6    0    d
5    5    9    d
6    K    1    d
7    k    3    n
8    1    2    f

objective是修改值var1==k&var3==n,比如9的系数:

df$var2[df$var1=="k" & df$var3=="n"] <- df$var2[df$var1=="k" & df$var3=="n"]/9

但是,感兴趣的实际 df 会生成上述问题中所述的错误消息。其中提供的答案,否定 NA 的每个条件,df$var1=="k" & !is.na(df$var1) 用大量的代码行解决了这个问题。

我的问题:是否有使用比方说 plyr 的更简单的解决方案?

我们可以使用data.table。将 'data.frame' 转换为 'data.table' (setDT(df))。我们在'i'中指定逻辑条件,赋值(:=)变量('var2')为'var2/9'。这将是有效的,因为它会就地修改。

library(data.table)
setDT(df)[!is.na(var1) & var1=='k' & var3=='n', var2 := var2/9]