OP 请求对选定值进行 1:1 替换,即仅涉及一个数据字段。除了嵌套的ifelseapproach,这可以通过使用因子或join来完成更大的数据。
如果需要替换两个或三个以上的值,“硬编码”嵌套 ifelse 方法很容易变得不方便。
因素案例 1:是,否
# create some data
loan_status <- c("Fully Paid", "Charged Off", "Something", "Else")
# do the conversion
factor(loan_status, levels = c("Fully Paid", "Charged Off"), labels = c("Yes", "No"))
#[1] Yes No <NA> <NA>
#Levels: Yes No
或者,
as.character(factor(loan_status, levels = c("Fully Paid", "Charged Off"), labels = c("Yes", "No")))
#[1] "Yes" "No" NA NA
如果预期结果为字符。
因式 2:0L、1L 作为整数
如果预期结果是整数类型,仍然可以使用因子方法,但需要进行额外的转换。
as.integer(as.character(factor(loan_status, levels = c("Fully Paid", "Charged Off"), labels = c("0", "1"))))
#[1] 0 1 NA NA
请注意,此处必须转换为字符。否则,结果将返回因子水平的数量:
as.integer(factor(loan_status, levels = c("Fully Paid", "Charged Off"), labels = c("0", "1")))
#[1] 1 2 NA NA
加入
如果数据较大且要替换许多项目,使用data.table 连接可能是值得考虑的替代方案:
library(data.table)
# create translation table
translation_map <- data.table(
loan_status = c("Fully Paid", "Charged Off"),
target = c(0L, 1L))
# create some user data
DT <- data.table(id = LETTERS[1:4],
loan_status = c("Fully Paid", "Charged Off", "Something", "Else"))
DT
# id loan_status
#1: A Fully Paid
#2: B Charged Off
#3: C Something
#4: D Else
# right join
translation_map[DT, on = "loan_status"]
# loan_status target id
#1: Fully Paid 0 A
#2: Charged Off 1 B
#3: Something NA C
#4: Else NA D
默认情况下 (nomatch = NA),data.table 进行右连接,即获取 DT 的所有行。