我正在学习如何在R中编写使用常见包(如data.table和dplyr)的函数。
这个函数可以计算特定类别内某些其他组的观察值的百分比(例如:2015年发布的10-20mpg汽车的份额),并生成一个表格。以下是没有函数的情况:
library(data.table)
library(scales)
#Create test dataframe and cut off points
test<-data.frame(x=c(0:10), y=c(rep(1,5),rep(2,6)), z=c("A","A","A","B","B","B","C","C","C","C","C"))
test <- data.table(test)
#trial non function version (calculating share of row by category z): works
tmp<-test[,.(N=.N), keyby=.(y,z)]
tmp[,total:=sum(N), by=y]
tmp[,percent:=percent(N/total)]
dcast(tmp,y ~ z, value.var="percent")
但是,为了使其在函数中起作用,我必须使用get。一旦get被评估,两个分类变量的引用就必须分别称为“get”和“get.1”,用于代码的其他部分(见下文)。有没有避免这种情况的方法?
#Two way table function: data.table
tw_tab<-function(dt,v1,v2){
#set up variables as charaters
v1<-as.character(substitute(v1))
v2<-as.character(substitute(v2))
dt<-as.character(substitute(dt))
#function
tmp<-get(dt)[,.(N=.N), keyby=.(get(v1),get(v2))]
tmp[,total:=sum(N), by=get]
tmp[,percent:=percent(N/total)]
dcast(tmp,get ~ get.1, value.var="percent")
}
#test function
tw_tab(test, y, z)
我尝试在整个代码中只使用“get(v1)”和“get(v2)”,但这并不起作用。
我查看了其他帖子关于data.table中用户函数的内容(例如Get a user-defined function work in data.table),但它们似乎没有涉及到此问题或遇到过此问题。
由于我是新手,所以非常感谢任何其他人对更好方法的反馈/评论。
.(N = .N)
和.N
的作用是相同的,因为这是默认名称。此外,在函数内部,使用 keyby 和 by 没有任何区别。 - Frank