2016-07-14 18 views
0

我有一個241列和114行的DF。第60列:241是我想根據變量組(T1和T2)進行配對t檢驗的數值。對於一個單獨的變量,我設法用reshape2包的acast命令和t.test來完成這項工作,但是如果我能夠找到一個命令爲所有182個變量自動執行此操作,那麼它將爲我節省大量的手動工作。在多個自動生成的數據框上執行t.test?

我設法使一個簡單的例子就是我想要的代碼:

> df 
    PatientID Group Immvar1 Immvar2 
1   1 T1  4  5 
2   2 T1  7  8 
3   2 T2  9  10 
4   3 T1  2  3 
5   3 T2  4  5 
6   4 T1  1  2 
7   4 T2  9  10 

> df1 <- as.data.frame(acast(df$PatientID ~df$Group, data = df, fill=0, value.var=("Immvar1"))) 
> df1 
    T1 T2 
1 4 0 
2 7 9 
3 2 4 
4 1 9 
> t.test(df1$T1,df1$T2, paired=TRUE) 

我已建成,使這個自動運行如下的代碼如下:

df2 <-df[,3:4] 
modelList<-list() 
for (i in 1:ncol(df2)) { 
    matrix <- formula(paste("as.data.frame(acast(PatientID ~ Group , data = df1, fill=0, value.var=(", names(df2[i]),")))")) 
    modelList[[i]] <-t.test(matrix$T1, matrix$T2, paired=TRUE) 
} 

但我總是得到運行此命令時出現錯誤消息:

匹配錯誤(x,table,nomatch = 0L):未找到對象'Immvar1'

也許我必須採取完全不同的方式,並且是不適合這種操作的模型師/配方組合。有人有想法做這個工作嗎?

回答

2

我認爲你的公式/粘貼線是問題;你應該直接調用cast函數。 (dcast會自動將它放入data.frame中。)如果沒有可重現的例子,我無法測試這個,但是這裏有一個猜測。我也使用lapply來照顧簿記。

results <- lapply(names(df)[3:4], function(n) { 
    matrix <- dcast(PatientID ~ Group, data = df, fill=0, value.var=n) 
    t.test(matrix$T1, matrix$T2, paired=TRUE) 
}) 

此外,你確定你想填補缺失的行與零?通常當缺少某些東西時,該值是未知的。

您可能會考慮避免首先投射的其他事物是使用t.test的公式表示法(儘管它需要配對值排列,因此缺少的值會成爲問題),或者使用雙向Anova Group和PatientID(相當於)。

爲了收集測試結果,您需要從輸出中收集所需的部分。運行str(tmp)unclass(tmp)以查看輸出實際的外觀。這是一個列表,因此您可以單獨使用$或使用[單獨收集所需的部分,然後將其取消列出。要放入一個矩陣,你需要將它們結合在一起,並且由於你想要的元素已經在列表中,所以你使用do.call來做到這一點。例如

tmp <- lapply(results, function(x) unlist(x[c("statistic", "parameter", 
       "p.value", "conf.int", "estimate")])) 
as.data.frame(do.call(rbind, tmp)) 

哈德利韋翰的各種包提供替代的方式來做到這一點「裂應用於-結合」; melt from reshape2 and ddply from plyr是我會用的,如果我要使用這些軟件包,但是使用base R沒有任何問題,正如我們在這裏所做的那樣。

+0

非常感謝你!經過一些調整後,它也適用於我的原始數據集!真的很棒,爲我節省了很多工作!事實上,對於NA和0,你當然是完全正確的。我不知道你是否知道一個簡單的方法來做到這一點,但是也有可能R將t.test的結果排列在更多友善的方式?在進行線性迴歸時,我使用包裝掃帚進行整理和掃描,但我不知道t.test的替代方案。 –

+0

我認爲你必須替換unlist(tmp [..通過unlist(x [...在代碼中,然後它很好用!!這是一個命令,我也可以將它應用到很多其他腳本中。非常多! –

+0

固定,謝謝.. – Aaron

相關問題