将具有不同长度的向量的列表转换为数据帧

时间:2017-05-31 00:55:34

标签: r list dataframe

我正在尝试将包含不同长度(类型因子)的多个向量的列表转换为具有相同行数作为列表中的元素且仅有一列的数据帧。

示例:

ex.list <- (list(c("Tom", "Ron", "Joe"), c("Ron", "Joe"), c("Tom")))
ex.list <- lapply(ex.list, function(x) as.factor(x))

所需的输出将是:

ex.list
        col1
    #1 Tom, Ron, Joe
    #2 Ron, Joe
    #3 Tom

当我致电str(ex.list$col1)时 我想得到:

Factor w/3 levels: "Tom, Ron, Joe"

我在3行3列的数据框中转换ex.list没有问题,但这不是我想要的。

这里最好的方法是什么? 我应该unlist并以某种方式将向量序列化到这3行1列数据帧中吗?有没有方便的功能呢?

2 个答案:

答案 0 :(得分:2)

df =  data.frame(col1 = unlist(lapply(ex.list, paste, collapse = ", ")))
> df
           col1
1 Tom, Ron, Joe
2      Ron, Joe
3           Tom

要获得唯一的名称,您必须运行类似

的内容
> unique(unlist(strsplit(as.character(df[ , 1]), ", ")))
[1] "Tom" "Ron" "Joe"

您无法按照您希望的data.frame设置方式查看因素级别。

答案 1 :(得分:1)

您可以将列表列与tidyr::nesttidyr::unnest

一起使用
library(tidyverse)
df <- data.frame(id=seq_along(ex.list), col1 = unlist(lapply(ex.list, paste, collapse = ","))) %>%
  mutate(col1 = stringr::str_split(col1, ",")) %>%
  unnest %>% 
  mutate(col1=as.factor(col1)) %>% 
  nest(col1)

str(df)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   3 obs. of  2 variables:
 $ id  : int  1 2 3
 $ data:List of 3
  ..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    3 obs. of  1 variable:
  .. ..$ col1: Factor w/ 3 levels "Joe","Ron","Tom": 3 2 1
  ..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    2 obs. of  1 variable:
  .. ..$ col1: Factor w/ 3 levels "Joe","Ron","Tom": 2 1
  ..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    1 obs. of  1 variable:
  .. ..$ col1: Factor w/ 3 levels "Joe","Ron","Tom": 3