我正在寻找一种方法来改进我的代码,并远离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