在R中:如何使用tidyverse将长度不等的向量列表强制为数据帧?
假设R中有以下列表:在R中:如何使用tidyverse将长度不等的向量列表强制为数据帧?,r,list,tidyverse,R,List,Tidyverse,假设R中有以下列表: list_test <- list(c(2,4,5, 6), c(1,2,3), c(7,8)) 我试图用tidyverse找到一个解决方案,但要么丢失了列表的索引/名称,要么向量长度不相等。您可以给列表命名,然后在base R中使用堆栈 names(list_test) <- seq_along(list_test) stack(list_test) # values ind #1 2 1 #2 4 1 #3 5
list_test <- list(c(2,4,5, 6), c(1,2,3), c(7,8))
我试图用tidyverse找到一个解决方案,但要么丢失了列表的索引/名称,要么向量长度不相等。您可以给列表命名,然后在base R中使用
堆栈
names(list_test) <- seq_along(list_test)
stack(list_test)
# values ind
#1 2 1
#2 4 1
#3 5 1
#4 6 1
#5 1 2
#6 2 2
#7 3 2
#8 7 3
#9 8 3
或者imap\u dfr
来自purr
purrr::imap_dfr(list_test, ~tibble::tibble(value = .x, list_index = .y))
您可以为列表命名,然后在base R中使用stack
names(list_test) <- seq_along(list_test)
stack(list_test)
# values ind
#1 2 1
#2 4 1
#3 5 1
#4 6 1
#5 1 2
#6 2 2
#7 3 2
#8 7 3
#9 8 3
或者imap\u dfr
来自purr
purrr::imap_dfr(list_test, ~tibble::tibble(value = .x, list_index = .y))
另一个选择是:
map_dfr(list_test, ~ enframe(.) %>%
select(-name), .id = "name")
name value
<chr> <dbl>
1 1 2
2 1 4
3 1 5
4 1 6
5 2 1
6 2 2
7 2 3
8 3 7
9 3 8
map\u-dfr(列表测试,~enframe(%)>%
选择(-name),.id=“name”)
名称值
1 1 2
2 1 4
3 1 5
4 1 6
5 2 1
6 2 2
7 2 3
8 3 7
9 3 8
或者,如果您不介意列也包含向量索引:
map_dfr(list_test, enframe, .id = "name_list")
name_list name value
<chr> <int> <dbl>
1 1 1 2
2 1 2 4
3 1 3 5
4 1 4 6
5 2 1 1
6 2 2 2
7 2 3 3
8 3 1 7
9 3 2 8
映射dfr(列表测试,enframe,.id=“名称列表”)
名称\列表名称值
1 1 1 2
2 1 2 4
3 1 3 5
4 1 4 6
5 2 1 1
6 2 2 2
7 2 3 3
8 3 1 7
9 3 2 8
另一个选项可以是:
map_dfr(list_test, ~ enframe(.) %>%
select(-name), .id = "name")
name value
<chr> <dbl>
1 1 2
2 1 4
3 1 5
4 1 6
5 2 1
6 2 2
7 2 3
8 3 7
9 3 8
map\u-dfr(列表测试,~enframe(%)>%
选择(-name),.id=“name”)
名称值
1 1 2
2 1 4
3 1 5
4 1 6
5 2 1
6 2 2
7 2 3
8 3 7
9 3 8
或者,如果您不介意列也包含向量索引:
map_dfr(list_test, enframe, .id = "name_list")
name_list name value
<chr> <int> <dbl>
1 1 1 2
2 1 2 4
3 1 3 5
4 1 4 6
5 2 1 1
6 2 2 2
7 2 3 3
8 3 1 7
9 3 2 8
映射dfr(列表测试,enframe,.id=“名称列表”)
名称\列表名称值
1 1 1 2
2 1 2 4
3 1 3 5
4 1 4 6
5 2 1 1
6 2 2 2
7 2 3 3
8 3 1 7
9 3 2 8
在
基本R
中,我们可以使用长度
复制序列,并取消列表
将列表
元素放入一个两列的“data.frame”
data.frame(value = unlist(list_test),
list_index = rep(seq_along(list_test), lengths(list_test)))
# value list_index
#1 2 1
#2 4 1
#3 5 1
#4 6 1
#5 1 2
#6 2 2
#7 3 2
#8 7 3
#9 8 3
在
base R
中,我们可以使用length
复制序列,并unlist
将列表
元素复制到两列“data.frame”中
data.frame(value = unlist(list_test),
list_index = rep(seq_along(list_test), lengths(list_test)))
# value list_index
#1 2 1
#2 4 1
#3 5 1
#4 6 1
#5 1 2
#6 2 2
#7 3 2
#8 7 3
#9 8 3
太神了非常感谢您的快速回复!我会尽快接受的!太神了非常感谢您的快速回复!我会尽快接受的!