R 从具有不同列名的表列表生成数据帧
我有一长串表需要转换成数据帧。问题是不同的表有不同的列名。所有名称的范围从1到5,但例如,一些表只有第2列,其他表有第4列和第5列,而其他表有5列 数据的一个例子是:R 从具有不同列名的表列表生成数据帧,r,tidyverse,R,Tidyverse,我有一长串表需要转换成数据帧。问题是不同的表有不同的列名。所有名称的范围从1到5,但例如,一些表只有第2列,其他表有第4列和第5列,而其他表有5列 数据的一个例子是: > head(bffrsTbls) [[1]] 2 5 711 1781 [[2]] 2 5 1168 1530 [[3]] 1 2 3 5 390 471 904 1237 我已经尝试了bffrsTbls%>%purrr::map_df(,d
> head(bffrsTbls)
[[1]]
2 5
711 1781
[[2]]
2 5
1168 1530
[[3]]
1 2 3 5
390 471 904 1237
我已经尝试了bffrsTbls%>%purrr::map_df(,dplyr::bind_rows)
,但是结果数据框中的值与每个表的列名不对应
我要寻找的结果是一个数据框,如下所示,其中列val1到val5对应于每个表的列1到5,另外一列显示该特定列的数据来自的列表元素的编号:
ListElmnt val1 val2 val3 val4 val5
1 NA 711 NA NA 1781
2 NA 1168 NA NA 1530
3 390 471 904 NA 1237
我们可以通过使用
map
循环list
将list
元素转换为tible
,并将其更改为单个数据帧
library(tidyverse)
map_dfr(bffrsTbls, ~ .x %>%
as.list %>%
as_tibble)
如果我们还需要所有组合,
enframe
将列表
元素设置为2列TIBLE,并将输出数据集扩展为“宽”格式
bffrsTbls %>%
map_df(enframe, .id = 'ListElmnt') %>%
mutate(name = factor(paste0('val', name), levels = paste0("val", 1:5))) %>%
spread(name, value, drop = FALSE)
# A tibble: 3 x 6
# ListElmnt val1 val2 val3 val4 val5
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 NA 711 NA NA 1781
#2 2 NA 1168 NA NA 1530
#3 3 390 471 904 NA 1237
数据
bffrsTbls它是一个vector
还是一个data.frame`as list element它是vector:$:'table'int[1:2(1d)]711 1781.-attr(,“dimnames”)=1的列表….$:chr[1:2]“2”“5”$:“table”int[1:2(1d)]1168 1530..-attr(,“dimnames”)=1….$的列表:chr[1:2]“2”“5”
xtabs(values ~ ListElmnt + ind, do.call(rbind, Map(cbind,
lapply(bffrsTbls, stack), ListElmnt = seq_along(bffrsTbls))))
bffrsTbls <- list(structure(c(`2` = 711, `5` = 1781), .Dim = 2L, .Dimnames = list(
c("2", "5")), class = "table"), structure(c(`2` = 1168, `5` = 1530
), .Dim = 2L, .Dimnames = list(c("2", "5")), class = "table"),
structure(c(`1` = 390, `2` = 471, `3` = 904, `5` = 1237), .Dim = 4L,
.Dimnames = list(
c("1", "2", "3", "5")), class = "table"))