2016-08-18 80 views
1

說,我有N個相同的(相同的行數和列)dataframes:應用功能在多個dataframes每個小區中的R

set.seed(2) 
df1 <- data.frame(replicate(100,rnorm(100))) 
df2 <- data.frame(replicate(100,rnorm(100))) 
dfN <- data.frame(replicate(100,rnorm(100))) 

我要應用一個函數(在這種情況下t.test())跨每個 N個數據幀的「單元」,以便返回的是一個單獨的數據幀,它包含每個執行的單元測試的值。從本質上講,我想利用每一個數據幀的第一個單元格,

one <- df1[1,1] 
two <- df2[1,1] 
Nth <- dfN[1,1] 

執行這些細胞t.test()

first.cell.each <- cbind.data.frame(one,two,Nth) 
t.test(first.cell.each, mu=0) 

並重復所有細胞(在這種情況下10000)。

編輯:澄清

+0

@ZheyuanLi,我的道歉,我應該更清楚。在行數和列數方面相同。 – DrPineapple

+3

您正在使用錯誤的數據結構。將data.frames合併到一個數組中並使用apply。 – Roland

+0

您現在可以使用新的'tidyr'軟件包來合併多個數據框並將其數據組合起來。請參閱https://blog.rstudio.org/2014/07/22/introducing-tidyr/ – smci

回答

2

我們可以創建一個matrix存儲具有單個數據集的相同尺寸的t.testp.value輸出。然後,遍歷行和列的序列,從每個數據集中提取元素,連接,並執行t.test並將輸出分配給'res'的同一行/列索引。

res <- matrix(, ncol=100, nrow=100) 
for(i in seq_len(nrow(df1))){ 
for(j in seq_len(ncol(df1))){ 
    res[i,j] <- t.test(c(df1[i,j], df2[i,j], dfN[i,j]), mu = 0)$p.value 

}} 

我的代碼也返回一個100 * 100矩陣

str(res) 
#num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ... 

如果有很多數據集,我們可以將它放在一個list,然後將其轉換爲array,做t.test使用apply

lst <- mget(paste0("df", c(1, 2, "N"))) 
ar1 <- array(unlist(lst), dim = c(dim(df1), length(lst))) 
res2 <- apply(aperm(ar1, c(3, 1, 2)), c(2,3), FUN = function(x) t.test(x, mu = 0)$p.value) 
str(res2) 
# num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ... 
1

假設你有所有的數據幀s AVED在列表datlst,該做的工作

z <- matrix(tapply(unlist(datlst, use.names = FALSE), 
        rep(gl(prod(dim(datlst[[1]])), 1), length(datlst)), 
        FUN = function (u) t.test(u, mu = 0)$p.value), 
      nrow = nrow(datlst[[1]])) 

你的榜樣數據幀datlst <- list(df1, df2, dfN),我的代碼成功返回你一個100 * 100矩陣:

str(z) 
# num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ...