【发布时间】:2017-08-31 13:25:15
【问题描述】:
我正在学习如何在 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)但他们似乎没有触及这个问题/遇到它。
我是新来的,所以如果有任何其他反馈/cmets 可以更好地做到这一点,我将不胜感激。
【问题讨论】:
-
仅供参考,
.(N = .N)和.N会做同样的事情,因为这是默认名称。另外,在函数中,我猜 keyby 和 by 没有任何收获。
标签: r data.table user-defined-functions