gpt4 book ai didi

r - 使用 data.frames 列表的索引在数据框的某些元素中应用函数

转载 作者:行者123 更新时间:2023-12-04 04:51:08 25 4
gpt4 key购买 nike

我有一个 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中选择df$A 的那些值对应于列表中的每个 data.frame 并计算 Fisher.test对于 P1...P6。我的做法是合并 dflist.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.testdf存储结果,然后使用索引 list.1[2]并计算 Fisher.test等等。这样就可以避免合并,因为所有的计算都是在 df 上进行的。 ,此外,这种方法还可以最大限度地减少 RAM 资源。但是,我不知道如何实现这一目标。也许是一个for循环?

谢谢

最佳答案

在此处利用 data.table 很有帮助,因为您可以使用 .( ) 轻松地对数据进行子集化语法和速度极快,尤其是与使用大数据相比,例如 subset

library(data.table)

# convert to data.table, setting the key to the column `A`
DT <- data.table(df, key="A")

p.col.names <- paste0("P", 1:6)
results <- lapply(list.1, function(ll)
DT[.(ll)][, lapply(.SD, Fisher.test), .SDcols=p.col.names] )

results

旁注

您可能想要修复 list.1 的名称以便结果形成 lapply正确命名
# fix the names, helpful for the lapply
names(list.1) <- lapply(list.1, names)

结果:
$AA
P1 P2 P3 P4 P5 P6
1: 0.04770305 0.1624142 0.2899578 0.029753 0.1070376 0.17549

$BB
P1 P2 P3 P4 P5 P6
1: 0.7174377 0.5965736 0.2561482 0.2561482 0.2561482 0.1997866

$CC
P1 P2 P3 P4 P5 P6
1: 0.0317663 0.139877 0.139877 0.05305057 0.1620897 0.2189595

$DD
P1 P2 P3 P4 P5 P6
1: 0.184746 0.4246214 0.2704228 0.1070376 0.3215871 0.1519672

关于r - 使用 data.frames 列表的索引在数据框的某些元素中应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17458587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com