【发布时间】:2021-12-10 12:40:03
【问题描述】:
我正在寻找一种方法来改进我的代码并摆脱 R 中的循环。
背景:
我有一个 Data.frames 列表。每个 Data.frame 有 4 个元素 - 其中许多是 NULL。我需要保留 NULL 并用 NA 替换它们,因为我登记/展平列表,然后将其作为列添加到“tibble”。我知道如果我使用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)
}
预期的输出是一个单列 tibble,它是列表的长度,NA 为原始列表中的 NULL 元素保留。
# A tibble: n x 1
element
<chr>
1 item2
2 NA
3 NA
4 item2
etc
我知道循环很慢,但我找不到另一种方法来访问 Data.frame 中的元素,然后将其转换为可用(平面)列,以添加到小标题中作为每个观察的另一个元素。
任何建议将不胜感激。
谢谢
詹姆斯
【问题讨论】:
-
请提供输入示例,而不仅仅是预期输出(使用
dput())。 -
试试
tibble::tibble(element = unlist(purrr::map_if(my_list, ~length(.x) == 0, ~ NA)))。 -
嗨@RitchieSacramento,感谢您的回复。抱歉,我在解释我的输出时不清楚,我现在已经调整了它 - 我只需要访问列表中每个 DF 中的一个项目。谢谢
-
试试(假设感兴趣的向量是字符类型)
tibble::tibble(element = purrr::map_chr(my_list, 2, .default = NA_character_))。 -
@RitchieSacramento,再次感谢。这非常有效。