从R中的data.frames列表中提取非空元素

从R中的data.frames列表中提取非空元素,r,list,loops,dataframe,lapply,R,List,Loops,Dataframe,Lapply,我有一个名为G的数据帧列表 在BASE R中,我想知道如何在A和B中分别提取元素dint和SD,跳过任何NULL元素 我想要的输出是:dint=list(A=1:3,B=c(1:4,5:6)) SD=列表(A=0:2,B=c(2:5,3:4)) 以下是数据: G <- list(A = list(short = NULL, short2 = NULL, del1 = data.frame(dint = 1:3, SD = 0:2), del11 = NULL

我有一个名为
G
的数据帧列表

在BASE R中,我想知道如何在
A
B
中分别提取元素
dint
SD
,跳过任何
NULL
元素

我想要的输出是:
dint=list(A=1:3,B=c(1:4,5:6))
SD=列表(A=0:2,B=c(2:5,3:4))

以下是数据:

G <- list(A = list(short = NULL, short2 = NULL, del1 = data.frame(dint = 1:3, SD = 0:2), 
               del11 = NULL), 
          B = list(short = data.frame(dint = 1:4, SD = 2:5), short2 = NULL, del1 = 
               data.frame(dint = 5:6, SD = 3:4), del11 = NULL))

G我们可以使用嵌套的
lappy

lapply(G, function(x) unlist(lapply(x, `[[`, 'dint'), use.names = FALSE))

#$A
#[1] 1 2 3

#$B
#[1] 1 2 3 4 5 6
对于
“SD”
也类似

lapply(G, function(x) unlist(lapply(x, `[[`, 'SD'), use.names = FALSE))

#$A
#[1] 0 1 2

#$B
#[1] 2 3 4 5 3 4

我们可以只调用一个
lappy
并提取组件

lapply(G, function(x) do.call(rbind, x)$dint)
#$A
#[1] 1 2 3

#$B
#[1] 1 2 3 4 5 6
或提取“SD”

lapply(G, function(x) do.call(rbind, x)$SD)  
#$A
#[1] 0 1 2

#$B
#[1] 2 3 4 5 3 4

它可以被做成一个函数

f1 <- function(lstI, elementName){
            lapply(lstI, function(x) do.call(rbind, x)[[elementName]])
  }
f1(G, "dint")
f1(G, "SD")

@然后,您可以使用
Filter(否定(is.null)),lappy(G,…
lapply(G, function(x) do.call(rbind, x))