【问题标题】:Use mutate_at with nested ifelse将 mutate_at 与嵌套的 ifelse 一起使用
【发布时间】: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(.))))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    主要问题是

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

    if/else 作用于lengthvector 1。如果应用该函数的vector/columnlength 大于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)
    

    【讨论】:

      猜你喜欢
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2013-10-11
      • 2018-09-20
      • 2017-01-24
      相关资源
      最近更新 更多