【发布时间】:2018-01-04 23:28:15
【问题描述】:
这将使不在列 A 中的值在给定条件下不存在(使用 %>%)。
mutate_at(vars(-columnA), funs(((function(x) {
if (is.logical(x))
return(x)
else if (!is.na(as.numeric(x)))
return(as.numeric(x))
else
return(NA)
})(.))))
如何使用 mutate_at 和嵌套的 ifelse 获得相同的结果?
例如,这不会产生相同的结果:
mutate_at(vars(-columnA),funs(ifelse(is.logical(.),.,
ifelse(!is.na(as.numeric(.)),as.numeric(.),NA))))
更新 (2018-1-5)
这个问题的意图令人困惑,部分原因是我对传递给函数的内容存在误解。
这是我本来打算写的:
mutate_at(vars(-columnA), funs(((function(x) {
for(i in 1:length(x))
{
if(!is.na(as.numeric(x[i])) && !is.logical(x[i]))
{
x[i] <- as.numeric(x[i]);
}
else if(!is.na(x[i]))
{
x[i] <- NA
}
}
return(x)
})(.))))
这是一个更好的解决方案:
mutate_at(vars(-columnA), function(x) {
if(is.logical(x))
return(x)
return(as.numeric(x))
})
ifelse 在这种情况下可能不合适,因为它返回的值与条件相同,即 1 个逻辑元素。在这种情况下,is.logical(.),条件的结果长度为 1,因此返回值将是传递给函数的列的第一个元素。
更新 (2018-1-6)
使用 ifelse,这将按原样返回包含逻辑值或 NA 的列,否则它会将 as.numeric 应用于列。
mutate_at(vars(-columnA),funs(
ifelse(. == TRUE | . == FALSE | is.na(.),.,as.numeric(.))))
【问题讨论】: