寻找最佳变量以用首选变量的顺序替换 NA
Finding best variable to replace NAs with order of preferred variables
我有一个包含很多 NAs
的数据集。我想用 variable1
中的值创建一个新变量。如果 variable1
是 NA,则使用 variable2
代替。如果 variable2
也是 NA
,则使用 variable3
,等等。我已经创建了一个函数来执行此操作,但它没有按预期工作。
best_variable <- function(var_best1,var_best2,var_best3){
if(!is.na(var_best1)) {return(var_best1)}
if(is.na(var_best1) & !is.na(var_best2)) {return(var_best2)}
if(is.na(var_best1) & is.na(var_best2) & !is.na(var_best3)) {return(var_best3)}
if(is.na(var_best1) & is.na(var_best2) & is.na(var_best3)) {return(NA)}
}
参见 mtcars 数据集示例。
test <- head(mtcars)
test$vs[3:5] <- NA; test$am[test$am == 1] <- NA
test$new_var <- best_variable(test$vs,
test$am,
test$gear)
Not the expected result as new_var[3] should be 4, as test$gear[3] is 4.
test$new_var <- lapply(mtcars[,.(vs,am,gear)], best_variable) # error
best_variable(test$vs[3],
test$am[3],
test$gear[3]) # Gets the right result
我在这里错过了什么?为什么我的函数在应用于整个数据集时不起作用?
best_variable <- function (...) {
apply(rbind(...), 2, function (a) {na.omit(a)[1]})
}
best_variable (test$vs, test$am, test$gear)
# [1] 0 0 4 0 0 1
我有一个包含很多 NAs
的数据集。我想用 variable1
中的值创建一个新变量。如果 variable1
是 NA,则使用 variable2
代替。如果 variable2
也是 NA
,则使用 variable3
,等等。我已经创建了一个函数来执行此操作,但它没有按预期工作。
best_variable <- function(var_best1,var_best2,var_best3){
if(!is.na(var_best1)) {return(var_best1)}
if(is.na(var_best1) & !is.na(var_best2)) {return(var_best2)}
if(is.na(var_best1) & is.na(var_best2) & !is.na(var_best3)) {return(var_best3)}
if(is.na(var_best1) & is.na(var_best2) & is.na(var_best3)) {return(NA)}
}
参见 mtcars 数据集示例。
test <- head(mtcars)
test$vs[3:5] <- NA; test$am[test$am == 1] <- NA
test$new_var <- best_variable(test$vs,
test$am,
test$gear)
Not the expected result as new_var[3] should be 4, as test$gear[3] is 4.
test$new_var <- lapply(mtcars[,.(vs,am,gear)], best_variable) # error
best_variable(test$vs[3],
test$am[3],
test$gear[3]) # Gets the right result
我在这里错过了什么?为什么我的函数在应用于整个数据集时不起作用?
best_variable <- function (...) {
apply(rbind(...), 2, function (a) {na.omit(a)[1]})
}
best_variable (test$vs, test$am, test$gear)
# [1] 0 0 4 0 0 1