【问题标题】:R - Transform Data.frame elements into a single column tibble()R - 将 Data.frame 元素转换为单列 tibble()
【发布时间】: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,再次感谢。这非常有效。

标签: r list loops nested


【解决方案1】:

使用sapply 的基本 R 选项 -

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 2019-12-18
    • 2020-08-02
    相关资源
    最近更新 更多