我正在使用 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 )
但我認為上述方法行不通。此外,如果因子變數很多,并且這些因子變數中的每一個都有許多可能的水平,那么這也不是一種非常有效的方法。
有人可以告訴我如何做到這一點嗎?
謝謝!
uj5u.com熱心網友回復:
此代碼可能會回傳您想要的內容(在您的示例中,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)。
.指當前值,與old_data使用該cur_column()函式的對應列進行比較。
編輯:更正across()為僅檢查字符列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/389572.html
上一篇:條件下替換NA
