2

私はdata.frame次のようなものを持っています:

>df

  A B   C  P1  P2  P3  P4  P5  P6
1 a 1 0.1 0.1 0.1 0.4 0.2 0.1 0.4
2 b 1 0.2 0.1 0.4 0.2 0.1 0.2 0.2
3 c 1 0.4 0.4 0.1 0.2 0.1 0.1 0.4
4 d 2 0.1 0.1 0.7 0.5 0.1 0.7 0.1
5 e 2 0.5 0.7 0.5 0.1 0.7 0.1 0.5
6 f 2 0.7 0.5 0.5 0.7 0.1 0.7 0.1
7 g 3 0.1 0.1 0.1 0.2 0.2 0.2 0.5
8 h 3 0.2 0.2 0.1 0.5 0.2 0.2 0.5
9 i 3 0.5 0.1 0.2 0.1 0.1 0.5 0.2 

そして、これに似た data.frames のリスト:

list.1 <- list(data.frame(AA=c("a","b","c","d")), 
             data.frame(BB=c("e","f")), 
             data.frame(CC=c("a","b","i")), 
             data.frame(DD=c("d","e","f","g")))

その上、私はこの機能を持っています:

Fisher.test <- function(p) {
  Xsq <- -2*sum(log(p), na.rm=T)
  p.val <- 1-pchisq(Xsq, df = 2*length(p))
  return(p.val)
}

dfリスト内の各 data.frame に対応する df$A の値を選択し、 P1...P6Fisher.testを計算したいと思います。私が行っていた方法は、マージしてから、リスト内のそれぞれに適用することです:dflist.1Fisher.methoddata.frame

func <- function(x,y){merge(x,y, by.x=names(x)[1], by.y=names(y)[1])}

ll <- lapply(list.1, func, df)

ll.fis <- lapply(ll, FUN=function(i){apply(i[,4:9],2,Fisher.test)})

これは機能しますが、私の実際のデータは巨大なので、別のアプローチでは要素のインデックスを使用して結果を格納し、次にインデックスを使用してlist.1[1]計算することができると思います。この方法では、すべての計算が上書きされるため、マージが回避されます。また、このアプローチでは RAM リソースも最小限に抑えられます。ただし、これを達成する方法がわかりません。おそらくforループ?Fisher.testdflist.1[2]Fisher.testdf

ありがとう

4

1 に答える 1