我正在尝试将包含不同长度(类型因子)的多个向量的列表转换为具有相同行数作为列表中的元素且仅有一列的数据帧。
示例:
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列数据帧中吗?有没有方便的功能呢?
答案 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::nest
和tidyr::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