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 您想要的(在您的示例中,var1
、var2
var3
不变并且 var4
、var5
等于 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()
以仅检查字符列。
我正在使用 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 您想要的(在您的示例中,var1
、var2
var3
不变并且 var4
、var5
等于 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()
以仅检查字符列。