首页 文章

R dplyr中的mutate / transform(传递自定义函数)

提问于
浏览
11

我正在使用新包,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))

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

3 回答

  • 6

    通过变换,您的函数必须在向量上运行 . 您可以使用 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") 
              }
         })}
    
  • 0

    我想你也可以使用group_by()来按行分隔行,然后进行计算,如下所示:

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

    你不需要使用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)
    

相关问题