gpt4 book ai didi

R - 有效地将列表列表的所有元素保存为 data.frame

转载 作者:行者123 更新时间:2023-12-03 23:58:33 25 4
gpt4 key购买 nike

我有以下列表,当数组的数值> 0 时,我想创建一个包含所有可能“路径”的 data.frame。

这是列表:

> ABBCCD2
$A1
$A1$B1
D1 D2
C1 0.233 0.078
C2 0.039 0.039

$A1$B2
D1 D2
C1 0.083 0.028
C2 0.056 0.056

$A1$B3
D1 D2
C1 0.083 0.028
C2 0.056 0.056


$A2
$A2$B1
D1 D2
C1 0.100 0.033
C2 0.017 0.017

$A2$B2
D1 D2
C1 0 0
C2 0 0

$A2$B3
D1 D2
C1 0 0
C2 0 0

这就是我想要的结果:

> res
FUN INTC INTB INME prob
1 A1 B1 C1 D1 0.233
2 A1 B1 C1 D2 0.078
3 A1 B1 C2 D1 0.039
4 A1 B1 C2 D2 0.039
5 A1 B2 C1 D1 0.083
6 A1 B2 C1 D2 0.028
7 A1 B2 C2 D1 0.056
8 A1 B2 C2 D2 0.056
9 A1 B3 C1 D1 0.083
10 A1 B3 C1 D2 0.028
11 A1 B3 C2 D1 0.056
12 A1 B3 C2 D2 0.056
13 A2 B1 C1 D1 0.100
14 A2 B1 C1 D2 0.033
15 A2 B1 C2 D1 0.017
16 A2 B1 C2 D2 0.017

我已经用 for 循环解决了这个问题,但效率不高,因为我遇到的真正问题有 1500 万条可能的路径,并且可能需要几天时间才能解决。这是我制作的代码:

m <- 0

# creamos dataframe vacio
res <- data.frame(FUN=character(),INTC=character(),INTB=character(),INME=character(),prob=numeric())


for(i in 1:length(ABBCCD2)) { # A


for (j in 1:length(ABBCCD2[[1]])) { # B


for(k in 1:nrow(ABBCCD2[[1]][[1]])) { # C


for(f in 1:ncol(ABBCCD2[[1]][[1]])) { # D


# solo guardamos las prob > 0
if(ABBCCD2[[i]][[j]][k,f] > 0) {


# contador de caminos con probabilidad no-cero
m <- m + 1


# creamos la fila del data frame correspondiente y vamos rellenando
res[m,] <- data.frame(FUN=names(ABBCCD2[i]), INTC=names(ABBCCD2[[i]][j]), INTB=rownames(ABBCCD2[[i]][[j]])[k],

INME = colnames(ABBCCD2[[i]][[j]])[f] , prob = ABBCCD2[[i]][[j]][k,f] )
}else{

}

}
}
}
}

有什么想法可以更有效地解决它吗?

谢谢大家

最佳答案

这是一个选项

library(rrapply)
library(purrr)
library(dplyr)
library(tidyr)
map_depth(ABBCCD2, 2, ~ as.data.frame.table(.x)) %>%
map_dfr(~ bind_rows(.x, .id = 'INTC'), .id = 'FUN') %>%
rename_at(3:5, ~c("INTB", "INME", "prob")) %>%
filter(prob != 0)

-输出

#    FUN INTC INTB INME       prob
#1 A1 B1 C1 D1 -1.0978872
#2 A1 B1 C2 D1 -0.8782714
#3 A1 B1 C1 D2 0.1646925
#4 A1 B1 C2 D2 1.2239280
#5 A1 B2 C1 D1 0.2088934
#6 A1 B2 C2 D1 0.2191693
#7 A1 B2 C1 D2 -1.6247005
#8 A1 B2 C2 D2 -0.4496129
#9 A2 B1 C1 D1 0.3426282
#10 A2 B1 C2 D1 -1.0963979
#11 A2 B1 C1 D2 1.8424623
#12 A2 B1 C2 D2 -0.2248845
#13 A2 B2 C1 D1 -0.9655256
#14 A2 B2 C2 D1 0.6998366
#15 A2 B2 C1 D2 -1.2647063
#16 A2 B2 C2 D2 0.4514344

数据

ABBCCD2 <- list(A1 = list(B1 = structure(c(-1.0978871935389, -0.878271447742256, 
0.164692499183084, 1.22392804082201), .Dim = c(2L, 2L), .Dimnames = list(
c("C1", "C2"), c("D1", "D2"))), B2 = structure(c(0.208893448902667,
0.21916929248291, -1.62470051990683, -0.449612869059051), .Dim = c(2L,
2L), .Dimnames = list(c("C1", "C2"), c("D1", "D2")))), A2 = list(
B1 = structure(c(0.34262819072166, -1.09639792471103, 1.8424623311698,
-0.224884516346163), .Dim = c(2L, 2L), .Dimnames = list(c("C1",
"C2"), c("D1", "D2"))), B2 = structure(c(-0.965525564286861,
0.699836580462635, -1.26470634026811, 0.451434438203962), .Dim = c(2L,
2L), .Dimnames = list(c("C1", "C2"), c("D1", "D2"))), B3 = structure(c(0,
0, 0, 0), .Dim = c(2L, 2L), .Dimnames = list(c("C1", "C2"
), c("D1", "D2")))))

关于R - 有效地将列表列表的所有元素保存为 data.frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66305690/

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