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

pro*_*guy 14 r dplyr

我正在使用新包,dplyr并面临一些困难.

mutate(df,isOdd=digit%%2) or transform(df,isOdd=digit%%2)
Run Code Online (Sandbox Code Playgroud)

两者都很完美.

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

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

transform(df,isOdd=IsItOdd(digit))
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*all 11

通过变换,您的函数必须在向量上运行.您可以使用ifelse,它适用于矢量:

 isOdd <- function(x){ ifelse(x %% 2 == 0, "even", "odd") }
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

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

df %>% group_by(digit) %>% mutate(isOdd = IsItOdd(digit))
Run Code Online (Sandbox Code Playgroud)