根据多个条件替换 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]
这在某种程度上是对之前 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]