【问题标题】:Simplify a list to a data frame & create new columns from numeric vectors in the list将列表简化为数据框并从列表中的数字向量创建新列
【发布时间】:2020-01-24 23:01:53
【问题描述】:

我有一个相当简单的清单:

ls <- list(560L, 4163L, 3761L, 287:290, 4467L, 3564L, 200:202)

其中每一行对应于数据框中的一行:

df <- enframe(c("tom", "dick", "harry", "sally", "sarah", "petra", "helen"), value = "name", name = NULL)

由于列表的某些行元素包含一个数字向量,所以不像将列表转换为数据框并使用bind_cols 组合数据那么容易。

所以,我希望能够将列表简化为数据框,并将每个向量元素放入一列中,以便与 d​​f.此示例中的简化列表将是一个 7 行 x 4 列的数据框。 non-reprex 数据会发生变化,因此列数将表示最长数值向量中的元素数,而不仅仅是这个样本。

谢谢。

【问题讨论】:

  • 你能把你试图让问题更清楚的内容包括进来吗?
  • @camille 尝试了 lapply、do.call 和 rbind 的组合,但无济于事。我的问题是将向量拆分为它们自己的列。
  • 您可以将该代码编辑到问题中吗?即使是不工作的代码也会有帮助

标签: r tidyverse


【解决方案1】:

我们可以使用unnest_wider

library(tidyr)
library(dplyr)
set_names(ls, df$name) %>% 
       tibble(col = .) %>%
       unnest_wider(c(col))

或者在 stacking 进入 2 列 data.frame 之后,使用 pivot_wider

set_names(ls, df$name) %>% 
      stack %>%
      group_by(ind) %>% 
      mutate(rn = row_number()) %>% 
      ungroup %>%
      pivot_wider(names_from = ind, values_from = values)

如果我们需要相反的情况

df %>% 
   mutate(val = ls) %>% 
   unnest(val) %>% 
   group_by(name) %>%
   mutate(rn = str_c('col', row_number())) %>% 
   ungroup %>% 
   pivot_wider(names_from = rn, values_from = val)

unnest_wider

library(stringr)
df %>% 
    mutate(val = ls) %>%
    unnest_wider(c(val), names_repair = ~ c('name', str_c('col', 1:4)))

【讨论】:

  • 对于第二个选项,如果我们不想将名称转换为因子,我们可以使用enframe()
猜你喜欢
  • 2021-06-10
  • 2017-12-10
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 2014-07-10
  • 1970-01-01
相关资源
最近更新 更多