【问题标题】:mutate/transform in R dplyr (Pass custom function)R dplyr 中的变异/转换(传递自定义函数)
【发布时间】:2015-02-18 08:49:16
【问题描述】:

我正在使用新包 dplyr 并遇到一些困难。

mutate(df,isOdd=digit%%2) or transform(df,isOdd=digit%%2)

两者都完美运行。

我在问一个关于传递自定义方法的问题。

IsItOdd <- function(x) {
  if(x%%2==0)
     result<-"even"
  else
     result<-"odd"
  return(result)
}

transform(df,isOdd=IsItOdd(digit))

这不起作用,因为所有数字的整列都传递给函数。 有没有办法通过将一个单元格而不是整个列传递给函数来完成这项工作?

【问题讨论】:

  • transform(df,isOdd=vapply(digit, IsItOdd, ""))transform(df,isOdd=Vectorize(IsItOdd)(digit))?

标签: r dplyr


【解决方案1】:

使用变换,您的函数必须对向量进行操作。您可以改用ifelse,它适用于向量:

 isOdd <- function(x){ ifelse(x %% 2 == 0, "even", "odd") }

或者,您可以使用apply 函数之一将该函数应用于列中的每个值:

 isOdd <- function(x){
     sapply(x, function(x){
          if(x %% 2 == 0){
               return("even") 
          }else{
               return("odd") 
          }
     })}

【讨论】:

  • 你能解释一下为什么使用 transform/mutate 函数对整个向量而不是单个值进行操作吗?这不适用于基本函数(例如 sin() 或 log())。
  • @rmcd 我对你的问题很感兴趣,也许值得另一个话题?我猜dplyr::mutate 正在解析函数并试图猜测是传入单个值还是整个向量?
  • 顺便说一句,您可以使用dplyr::rowwise 强制执行正确的行为,但这仍然是一个有趣的问题
  • @WillCornwell 感谢您的响应和指向行的指针,我不知道。我在这里发布了一个问题stackoverflow.com/questions/49967559/…
【解决方案2】:

我认为您也可以使用 group_by() 通过唯一值来梳理行,然后进行计算,如下所示:

df %>% group_by(digit) %>% mutate(isOdd = IsItOdd(digit))

【讨论】:

    【解决方案3】:

    你不需要使用 mutate,你可以在 R base 或 purr 中使用它

    get_rango_edad <- function(x) {
        if (x <= 25) {
           return("18-25")
         } else{
            return("26+")
         }
      }
    
    encuestas$rango_edad <- map_chr(encuestas$edad,get_rango_edad)
    

    encuestas$rango_edad <- sapply(encuestas$edad,get_rango_edad)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多