私は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
を計算したいと思います。私が行っていた方法は、マージしてから、リスト内のそれぞれに適用することです:df
list.1
Fisher.method
data.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.test
df
list.1[2]
Fisher.test
df
ありがとう