R -将Data.frame元素转换为单列tibble()



我正在寻找一种方法来改进我的代码,并远离r中的循环。

背景:

我有一个Data.frames列表。每个Data.frame有4个元素-其中许多是NULL。我需要保留null并将它们替换为NA,因为我招募/平坦列表,然后将其作为列添加到"点状图"。我知道如果我用map(list, n)访问元素,它会给我循环的起点。如果我flatten()这将删除NULL对象,我将无法将其添加到我正在使用的另一个标题中,因为顺序没有保留。

输入结构如下:

[[1]]
item1 item2 item3 item4
1  aaaa  bbbb  cccc  dddd
[[2]]
data frame with 0 columns and 0 rows
[[3]]
data frame with 0 columns and 0 rows
[[4]]
item1 item2 item3 item4
1  ffff  gggg  hhhh  kkkk

目前的解决方案:

我写了下面的循环:

element_tibble = tibble()
for (i in 1:length(list_of_dfs)){
element = list_of_dfs[[i]]
if (is.null(element) == TRUE) {
element = NA
}
else {
element = element
}
row = c(element = element)
element_tibble = rbind(element_tibble, row)
}

预期的输出是一个单列的索引,它是原始列表中保留NULL元素的NA的列表长度。

# A tibble: n x 1
element
<chr>  
1 item2  
2 NA       
3 NA     
4 item2 
etc 

我知道循环很慢,但我找不到另一种方法来访问Data.frame中的元素,然后将其转换为可用的(平面)列,以便将每个观察值添加到标题中作为另一个元素。

如有任何建议,不胜感激。

感谢詹姆斯

Base R选项使用sapply-

df <- data.frame(item1 = 'aaaa', item2 = 'bbbb', item3 = 'ccc', item4 = 'ddd')
list_of_dfs <- list(df, data.frame(), df)
result <- data.frame(element = sapply(list_of_dfs, function(x) 
if(nrow(x)) x[[2]] else NA))
result
#  element
#1    bbbb
#2    <NA>
#3    bbbb