R:在用户定义的函数中使用get和data.table

罗伯特·S

我正在学习如何在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用户函数的其他文章(例如,在data.table中获得用户定义的函数),但是他们似乎并没有解决这个问题。

我对此并不陌生,因此,如果您有其他关于这样做的更好方法的反馈/意见,将不胜感激。

mt1022

你不必调用getdt(根据我的经验,get是最经常用来指一列使用字符串),你可以提供文字载体bykeyby

tw_tab <- function(dt,v1,v2){

    #set up variables as charaters
    v1<-as.character(substitute(v1))
    v2<-as.character(substitute(v2))

    #function
    tmp <- dt[,.(N=.N), keyby = c(v1, v2)]
    tmp[,total:=sum(N), by= c(v1)]
    tmp[,percent:=percent(N/total)]
    dcast(tmp, paste(v1, '~', v2), value.var="percent")
}

#test function
tw_tab(test, y, z)
#    y     A     B     C
# 1: 1 60.0% 40.0%    NA
# 2: 2    NA 16.7% 83.3%

这也是使用xtabs的解决方案prop.table

tw_tab <- function(x, v1, v2){
    fm <- bquote(~ .(substitute(v1)) + .(substitute(v2)))
    res <- prop.table(xtabs(formula = fm, data = x), 1)
    res <- as.data.frame.matrix(res)
    res[] <- lapply(res, scales::percent)
    return(res)
}

tw_tab(test, y, z)
#     A     B     C
# 1 60% 40.0%  0.0%
# 2  0% 16.7% 83.3%

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章