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

时间:2015-02-18 08:49:17

标签: r dplyr

我正在使用新包,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 个答案:

答案 0 :(得分:11)

通过变换,您的函数必须对向量进行操作。您可以使用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") 
          }
     })}

答案 1 :(得分:6)

我认为您也可以使用group_by()按唯一值分隔行,然后进行计算,如下所示:

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

答案 2 :(得分:0)

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

import numpy as np
arr3 = np.zeros(shape=[4, 4, 3])
arr2 = np.zeros(shape=[4, 4])

#This is ok but I dont want
arr3[0,0]*arr2[0,0] # thats [0,0,0]*0
#This is not ok but I need
arr3[:,:]*arr2

get_rango_edad <- function(x) {
    if (x <= 25) {
       return("18-25")
     } else{
        return("26+")
     }
  }

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