使用带有用户定义函数的cut和dplyr :: mutate

时间:2016-09-15 13:55:45

标签: r function dplyr cut

我是R的一个相对较新的用户(来自Stata)并且正在寻找在R中创建用户定义的函数来模拟Stata的egen cut命令。

我现在已经成功 - 但我真的不确定为什么 - 而且希望有人可以解释发生了什么。

#Create test dataframe and cut off points
test<-data.frame(x=c(0:10), y=c(0.1,1,2,2,2,2,3,4,4,5,6))
cuts<-list(0,1,2,3,4,100)

#trial non function version: works
test %>% mutate(v_group = cut(y, breaks = cuts, labels=FALSE)) %>% count(v_group) %>% mutate(freq=percent(n/sum(n)))


#set function
egen_cut<-function(df,v,points){
   stopifnot(is.character(v))

   df %>% mutate_(v= ~cut(v, breaks=points, labels=FALSE)) %>% count(v)

}


#trial function version: fails 
egen_cut(test,"y", points=cuts)


#try alternative function
egen_cut2 <- function(df,v, points) {

  stopifnot(is.character(v))

  df %>% mutate_(v_group = v) %>% mutate_(v_group = ~cut(v_group, breaks=points, labels=FALSE)) %>% count(v_group) %>% mutate(freq=percent(n/sum(n)))

}


#trial function version: works
egen_cut2(test,"y", points=cuts)

你可以看到,在我的第一次尝试中,我得到错误&#34; x不是数字&#34;,并且在第二次尝试中它起作用。

我已经完成了一些阅读,我认为它与interp()有关,以及如何在dplyr中使用它:

https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html

这让我觉得实现目标的更好方法是使用这样的功能:

egen_cut <- function(df,v) {
  stopifnot(is.character(v))
  tmp <- interp(~cut(var, breaks =0:5, labels=FALSE), var=as.name(v))
  df %>% mutate_(v_group = tmp)
}

这也有效,但我再也不认为我完全理解逻辑。真的很感激帮助!谢谢。

0 个答案:

没有答案