我希望在数据框中的多个列上使用函数:
library(data.table)
id <- seq(1:1000)
region <- rep(c("A","B","C","D","E"),c(200,200,200,200,200))
treatment.1 <- sample(0:1, 1000, replace=T)
treatment.2 <- sample(0:1, 1000, replace=T)
d <- data.frame(id,region,treatment.1,treatment.2)
我希望创建一个函数,允许我按区域(在不同的处理组中)计算1的比例。到目前为止,我一直在使用以下代码:
setDT(d)[,.(.N,prop=sum(treatment.1==1)/.N),
by=region]
然而,当我尝试将代码转换为函数时,我遇到了一些问题(答案与我之前没有函数的情况不符):
treatment.pc <- function (x) {
setDT(d)[,.(.N,prop=sum(x==1)/.N),
by=region]
}
treatment.pc (d$treatment.1)
treatment.pc (d$treatment.2)
我需要对代码做些什么才能使其正常工作?
答案 0 :(得分:3)
setDT(d)
fun <- function (x) {
prob = mean(x==1L)
}
d[, c(lapply(.SD, fun), N = .N), by = region, .SDcols = c("treatment.1", "treatment.2")]
我不清楚你是否需要将最后一行包装成一个函数......
fun2 <- function(DT, fun, cols) {
setDT(DT)
DT[, c(lapply(.SD, fun), N = .N), by = region, .SDcols = cols]
}
fun2(d, fun, c("treatment.1", "treatment.2"))
答案 1 :(得分:0)
对于使用 var library = {
sample: function(callback) {
callback();
}
};
var $ = function(){
return library;
};
for (var method in library) {
if (library.hasOwnProperty(method) && typeof library[method] == 'function') {
$[method] = library[method].bind(library);
}
}
的问题,这可能是一个更简单的解决方案。
dplyr
只有一个行代码,您可以获得我认为您想要的结果,而且您不必编写函数。