在列上使用R函数

时间:2016-01-18 08:58:35

标签: r data.table

我希望在数据框中的多个列上使用函数:

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)

我需要对代码做些什么才能使其正常工作?

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

只有一个行代码,您可以获得我认为您想要的结果,而且您​​不必编写函数。