r - 将 mutate_at 与嵌套的 ifelse 一起使用

标签 r dplyr

这将使不在 columnA 中的值在给定条件(使用 %>%)的情况下不适用。

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 的列,否则它将作为数字应用于列。

mutate_at(vars(-columnA),funs(
ifelse(. == TRUE | . == FALSE | is.na(.),.,as.numeric(.))))

最佳答案

主要问题是

else if (!is.na(as.numeric(x)))
     return(as.numeric(x)) 

if/else 作用于 lengthvector 1. 如果length >应用函数的vector/column大于1,最好使用ifelse。在上面,!is.na(as.numeric(x)) 返回长度大于 1 的逻辑 vector(假设数据集中的行数大于 1)。让它工作的方法是用all/any包裹(取决于我们需要什么)

f1 <- function(x) {
    if (is.logical(x))
         return(x)
      else if (all(!is.na(as.numeric(x))))
         return(as.numeric(x))
          else
       return(x) #change if needed
}

df1 %>%
    mutate_all(f1)

数据

set.seed(24)
df1 <- data.frame(col1 = sample(c(TRUE, FALSE), 10, replace = TRUE),
     col2 = c(1:8, "Good", 10), col3 = as.character(1:10),
 stringsAsFactors = FALSE)

关于r - 将 mutate_at 与嵌套的 ifelse 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48105066/

相关文章:

r - 使用 R 创建光栅图像

r - Dplyr 或 Magrittr - tolower?

RODBC查询调整

r - 识别R中字符串匹配的百分比

r - 使用 dplyr 将所有不常见的字符串更改为 'other'

r - 如何在 ifelse 中设置 FALSE 条件以使其保持原始值

r - dplyr - 在嵌套列表中按元素汇总

r - ggplot 从图例中删除 geom_label 边框

r - 仅将 map 比例尺和指北针包含在一个 ggplot 方面

使用 ggplot 添加到投影 map 时 R 饼图扭曲