R:替换现有范围之外的值

R: Replacing Values Outside of an Existing Range

我正在使用 R 编程语言。假设我有以下数据:

var1 <- rnorm(100,10,1)
var2 <- rnorm(100,10,10)
var3 <- sample( LETTERS[1:2], 100, replace=TRUE, prob=c(0.5, 0.5) )
var4 <- sample( LETTERS[1:4], 100, replace=TRUE, prob=c(0.5, 0.25, 0.25, 0.25) )
var5 <- sample( LETTERS[1:3], 100, replace=TRUE, prob=c(0.5, 0.25, 0.25) )

d1 = data.frame(var1, var2, var3, var4, var5)

  d2 = data.frame(var1 = 0, var2 = 0, var3 = 0, var4 = 0, var5 = 0)

old_data = rbind(d1,d2)

      var1       var2 var3 var4 var5
1 8.932176 11.1764660    B    B    C
2 9.782025  0.5252539    A    A    B
3 8.973996  5.0944256    A    B    B
4 9.271109  7.4390781    B    A    A
5 9.374961 28.4386201    A    D    A
6 8.313307  3.4805010    A    B    C

现在,假设我有一行新数据:

new_data = data.frame(var1 = 2, var2 = 3, var3 = "A", var4 = "GG", var5 = "L")

我的问题:对于“new_data”中的所有因子变量(即var3、var4、var5),如果这些变量包含一个不包含的值在“old_data”内 - 然后我想将它们设为 0.

我尝试手动执行此操作:

#first, list all values of each factor variable

> table(old_data$var3)

 0  A  B 
 1 52 48 

> table(old_data$var4)

 0  A  B  C  D 
 1 43 18 15 24 

> table(old_data$var5)

 0  A  B  C 
 1 50 25 25 

#next, write the replacement function
ifelse(new_data$var3 != "A" & new_data$var3 != "B", new_data$var3 == 0, new_data$var3 == new_data$var3 )

ifelse(new_data$var4!= "A" & new_data$var4 != "B" & new_data$var4 != "C"  & new_data$var4 != "D", new_data$var4 == 0, new_data$var4 == new_data$var4 )


ifelse(new_data$var5!= "A" & new_data$var5 != "B" & new_data$var5 != "C" , new_data$var5 == 0, new_data$var5 == new_data$var5 )

但我认为上述方法行不通。此外,如果有很多因子变量,并且每个因子变量都有很多可能的水平,这将不是一种非常有效的方法。

有人可以告诉我怎么做吗?

谢谢!

此代码可能 return 您想要的(在您的示例中,var1var2 var3 不变并且 var4var5等于 0).

library(dplyr)

new_data %>% 
  mutate(across(where(is.character), ~ ifelse(. %in% as.list(old_data)[[cur_column()]], ., 0)))

mutate(across(where(is.character), ~ )) 允许您将函数应用于数据框的每个字符列。

函数为ifelse(. %in% as.list(old_data)[[cur_column()]], ., 0).

.指当前值,用cur_column()函数与old_data对应列进行比较。

编辑:更正 across() 以仅检查字符列。