2016-01-18 21 views
1

祝在一個數據幀使用功能上的列數使用的R函數:在柱上

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) 

我需要做些什麼來使代碼生效?

+1

「有些問題」,哈哈。所以,你需要解決一些問題。有點模糊...... – Roland

+0

我認爲問題是你只是傳遞一個向量到你的函數。但是,你的函數也期望有一個'region'。所以我想你必須通過一個名爲'region'的變量將data.frame傳遞給你的函數。 – Alex

+0

當你傳遞你的函數'd $ treatment.1'時,data.table不能告訴它是它自己變量的一部分,它只是看到一個二進制向量。所以它只是'd',sum(d $ treatment.1)/。N,by = region]'而不是'd [,sum(treatment.1)/。N,by = region]' –

回答

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")) 
+0

在這種情況下,做'd [,c(lapply(.SD,mean),.N),by = region,.SDcols = c(「treatment.1」,「treatment.2」)]。也許值得加上什麼是OPs錯誤也值得。 –

0

這可能是使用dplyr您的問題一個簡單的解決方案。

library(dplyr) 

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) 

by_col <- d %>% group_by(region) %>% summarise_each(funs(k = mean)) 

只有一行代碼,你會得到我想要的結果,你不必編寫函數。

+2

這比setDT(d)[,lapply(.SD,mean),by = region]'更簡單或更少的代碼? –

+0

尚未見過此解決方案。至少對我來說'dplyr'比'data.table'更直觀。但這可能取決於觀點。 – Alex

+0

OP正在詢問一個data.table問題。 –