2014-05-15 52 views
1

這裏是R新手的位,所以它可能是一個非常簡單的問題。t-test在函數中不起作用 - 變量長度不同

我有一個GENDER(是一個二進制變量)和一大堆數值變量的數據集。我想寫一個簡單的函數來檢查方差是否相等,然後執行適當的t檢驗。

所以我的第一次嘗試是這樣的:

genderttest<-function(x){            # x = outcome variable 

    attach(Dataset) 
    on.exit(detach(Dataset)) 

    VARIANCE<-var.test(Dataset[GENDER=="Male",x], Dataset[GENDER=="Female",x]) 

    if(VARIANCE$p.value<0.05){ 
    t.test(x~GENDER) 
    }else{ 
    t.test(x~GENDER, var.equal=TRUE) 
    } 
} 

這行之有效的函數(更換X,當然)以外,但這裏給了我一個錯誤,因爲可變長度不同。

所以我想它可能會奇怪處理NA的情況下,我應該先清理數據集,然後進行測試:

genderttest<-function(x){            # x = outcome variable 
    Dataset2v<-subset(Dataset,select=c("GENDER",x)) 
    Dataset_complete<-na.omit(Dataset2v) 

    attach(Dataset_complete) 
    on.exit(detach(Dataset_complete)) 

    VARIANCE<-var.test(Dataset_complete[GENDER=="Male",x], Dataset_complete[GENDER=="Female",x]) 

    if(VARIANCE$p.value<0.05){ 
    t.test(x~GENDER) 
    }else{ 
    t.test(x~GENDER, var.equal=TRUE) 
    } 
} 

但是這給了我同樣的錯誤。

如果有人能指出我的(可能是愚蠢的)錯誤,我將不勝感激。

+0

能否請您提供一個可重複的例子,所以我們可以搜索的錯誤? – Vincent

+0

通過重現性,您的意思是在開始時創建有問題的數據集的示例? – Timguin

+0

無論是那個數據集或另一個更簡單但相似,我們可以用 – Vincent

回答

1

我認爲問題在於,當您撥打t.test(x~GENDER)時,它正在評估Dataset範圍內的變量x,而不是您的函數的範圍。所以它試圖比較兩個性別之間的x的值,並且因爲Dataset在其中沒有稱爲x的變量而感到困惑。

應工作的溶液是調用:

do.call('t.test', args=list(formula=as.formula(paste0(x,'~GENDER')), data=Dataset)) 

do.call('t.test', args=list(formula=as.formula(paste0(x,'~GENDER')), var.equal=T, data=Dataset)) 

它將調用t.test()並傳遞的x的值作爲式參數的一部分,而不是字符x(即的代替score ~ GENDERx ~ GENDER)。

的理由讓你看到具體的錯誤是Dataset$GENDER具有長度等於Dataset的行數,而Dataset$x具有長度= 0

+0

完美,謝謝!如果按照你描述的方式處理x,我想我會得到一個「找不到對象」的錯誤,但是你的解決方案起作用了,所以一定是問題所在。再次感謝! – Timguin