2017-03-08 61 views
0

我想有在用下面的例子的數據的數據幀上執行數據的多個t.tests一般功能:使用迴路,用於在數據幀中的多個測試

dat <- data.frame(ID=c(1:100), 
        DRUG= rep(c("D1","D2","D2","D3","D3","D3","D5","D1","D4","D2"),10), 
        ADR=rep(c("A1","A2","A3","A6","A7","A8","A4","A2","A1","A2"),10), 
        X= sample(1:250, 100, replace=F)) 

基本上,我想要運行對於DRUG-ADR的每個獨特組合,X值爲兩個t檢驗。如果我以D1-A1爲例,我想測試D1-A1與D1-A <> 1的X值,D1-A1與D的差值爲<> 1-A1。下面是我對這個例子的語法,但我的問題是如何使一個通用的循環/函數爲DRUG-ADR的每個獨特組合執行兩個測試。

x <- ifelse (dat$DRUG == "D1" & dat$ADR == "A1",dat$X, NA) 
x <- x[!is.na(x)] 

y <- ifelse (dat$DRUG != "D1" & dat$ADR == "A1",dat$X, NA) 
y <- y[!is.na(y)] 

z <- ifelse (dat$DRUG == "D1" & dat$ADR != "A1",dat$X, NA) 
z <- z[!is.na(z)] 

t.test(x,y) 
t.test(x,z) 

所以備案號4(D3-A6)的語法是:

x <- ifelse (dat$DRUG == "D3" & dat$ADR == "A6",dat$X, NA) 
x <- x[!is.na(x)] 

y <- ifelse (dat$DRUG != "D3" & dat$ADR == "A6",dat$X, NA) 
y <- y[!is.na(y)] 

z <- ifelse (dat$DRUG == "D3" & dat$ADR != "A6",dat$X, NA) 
z <- z[!is.na(z)] 

t.test(x,y) 
t.test(x,z) 

任何人都得到了一個通用函數是個好主意?

編輯:我的理想結果將是下表:

Drug ADR pvalue1 pvalue2 
1 D1 A1 pval11 pval21 
2 D2 A2 pval12 pval22 
3 D.. A.. pval1.. pval2.. 

回答

1

由於在每一個規劃問題,解決的辦法是分兩個步驟:

  1. 摘要你的邏輯,使其一般
  2. 將抽象解決方案封裝成可重複使用的功能

您可以前往

  1. 重複在所有數據上調用該函數。

但是,首先:由於數據不足,t檢驗有時會失敗;讓我們更換t.test電話:

t_test = function (x, y, ...) { 
    tryCatch(t.test(x, y, ...)$p.value, error = function (err) NA) 
} 

然後,所有加在一起,這給了我們:

library(dplyr) # Makes data manipulation easier. 

test_combination = function (data, id) { 
    drug = data[id, ]$DRUG 
    adr = data[id, ]$ADR 

    match = filter(data, DRUG == drug, ADR == adr)$X 
    mismatch1 = filter(data, DRUG != drug, ADR == adr)$X 
    mismatch2 = filter(data, DRUG == drug, ADR != adr)$X 

    list(pval1 = t_test(match, mismatch1), pval2 = t_test(match, mismatch2)) 
} 

哪些測試的單一組合。現在,我們測試的所有的人:

result = lapply(dat$ID, test_combination, data = dat) %>% 
    bind_rows() %>% 
    bind_cols(dat, .) %>% 
    select(-X) 

或者,使用更dplyr樣(但在我看來有點模糊)的方法:

result = dat %>% 
    rowwise() %>% 
    do(bind_rows(test_combination(dat, .$ID))) %>% 
    bind_cols(dat, .) %>% 
    select(-X) 

注意如何代碼不使用顯式for循環。這就是在R中處理數據的方式:將函數應用於表或列表中的項目,而不是手動迭代。

請注意,從統計角度而言,上述問題是非常值得懷疑的。至少你需要執行嚴格的multiple testing correction