【发布时间】:2013-07-03 21:41:47
【问题描述】:
我有一个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...P6 计算 Fisher.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] 的元素索引来计算Fisher.test 在df 存储结果,然后使用list.1[2] 的索引并计算Fisher.test 等等。通过这种方式,可以避免合并,因为所有计算都是在df 上进行的,而且这种方法也可以最大限度地减少 RAM 资源。但是,我不知道如何实现这一目标。也许是一个 for 循环?
谢谢
【问题讨论】:
-
data.table 是您的朋友。将key设置为
A,然后使用lapply(list.1, function(x) DT[.(x), <expression>])
标签: r