我是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)
}
这也有效,但我再也不认为我完全理解逻辑。真的很感激帮助!谢谢。