通过平均向量展平嵌套列表

jO.*_*jO. 5 nested r list flatten

假设我有一个嵌套的向量列表.

lst1 <- list(`A`=c(a=1,b=1), `B`=c(a=1), `C`=c(b=1), `D`=c(a=1,b=1,c=1))
lst2 <- list(`A`=c(b=1), `B`=c(a=1,b=1), `C`=c(a=1,c=1), `D`=c(a=1,c=1))
lstX <- list(lst1, lst2)
Run Code Online (Sandbox Code Playgroud)

如图所示,每个矢量A,B,C,D出现两次,a,b,c存在于不同频率.

如何平展列表以便在嵌套列表中a,b,c求和或平均,这将是最有效的方法,A,B,C,D如下所示.真正的列表有几十万个嵌套列表.

#summed
  a b  c
A 1 2 NA
B 2 1 NA
C 1 1  1
D 2 1  2

#averaged
  a   b   c
A 0.5 1   NA
B 1   0.5 NA
C 0.5 0.5 0.5
D 1   0.5 1
Run Code Online (Sandbox Code Playgroud)

Dav*_*urg 5

这是一个简单的基础R解决方案(将返回0而不是NAs(不确定是否足够好)

temp <- unlist(lstX)
res <- data.frame(do.call(rbind, strsplit(names(temp), "\\.")), value = temp)
Run Code Online (Sandbox Code Playgroud)

总和

xtabs(value ~ X1 + X2, res)
#    X2
# X1  a b c
# A   1 2 0
# B   2 1 0
# C   1 1 1
# D   2 1 2
Run Code Online (Sandbox Code Playgroud)

手段

xtabs(value ~ X1 + X2, res) / length(lstX)
#    X2
# X1  a   b   c
# A 0.5 1.0 0.0
# B 1.0 0.5 0.0
# C 0.5 0.5 0.5
# D 1.0 0.5 1.0
Run Code Online (Sandbox Code Playgroud)

或者,更灵活的data.table解决方案

library(data.table) #V1.9.6+
temp <- unlist(lstX)
res <- data.table(names(temp))[, tstrsplit(V1, "\\.")][, value := temp]
Run Code Online (Sandbox Code Playgroud)

总和

dcast(res, V1 ~ V2, sum, value.var = "value", fill = NA)
#    V1 a b  c
# 1:  A 1 2 NA
# 2:  B 2 1 NA
# 3:  C 1 1  1
# 4:  D 2 1  2
Run Code Online (Sandbox Code Playgroud)

手段

dcast(res, V1 ~ V2, function(x) sum(x)/length(lstX), value.var = "value", fill = NA)
#    V1   a   b   c
# 1:  A 0.5 1.0  NA
# 2:  B 1.0 0.5  NA
# 3:  C 0.5 0.5 0.5
# 4:  D 1.0 0.5 1.0
Run Code Online (Sandbox Code Playgroud)

一般来说,您几乎可以使用任何功能 dcast