将不等长列表的列表转换为数据框
Turning lists of unequal length lists into data frames
我有一个从 JSON 获得的不等长列表的列表,我想将其合并为单个数据帧或一系列数据帧。例如,假设这是在我原来的 JSON:
上使用 fromJSON 的结果
mylist <- list(
list(
volume = array(1:6, dim=c(3,2)),
price = array(c(1,2,3,7,8,9), dim=c(3,2)),
name = 'A'
),
list(
volume = array(1:10, dim=c(5,2)),
price = array(c(1:5,12:16), dim=c(5,2)),
name = 'B'
),
list(
volume = array(1:14, dim=c(7,2)),
price = array(c(1:7,21:27), dim=c(7,2)),
name = 'C'
)
)
价格和交易量列表的长度不等,我想处理数据时假定给定变量的 n 个观测值是系列中的最后 n 个条目。因此,对于每个数据列表,我基本上都想丢弃第一列并使数据底部对齐。因此,一种表示价格数据的方法如下:
tribble(
~Day, ~PriceA, ~PriceB, ~PriceC,
#---|--------|--------|---------
1L, NA, NA, 21,
2L, NA, NA, 22,
3L, NA, 12, 23,
4L, NA, 13, 24,
5L, 7, 14, 25,
6L, 8, 15, 26,
7L, 9, 16, 27
)
如果这样做,我需要为卷创建一个单独的 table。我对表示最终数据集的其他方式持开放态度,例如在数据框中使用嵌套列。
有人知道如何优雅地执行此操作吗?让我特别困惑的是使用 purrr/map 对涉及的二级列表进行操作。
这是一个使用tidyverse
的选项
library(tidyverse)
out <- mylist %>%
transpose %>%
map(~ if(all(lengths(.x) == 1)) unlist(.x) else
map(.x, as_tibble) %>%
reduce(full_join, by = 'V1') %>%
mutate_all(funs(.[order(!is.na(.))])))
现在,我们可以提取 list
个元素
out$price %>%
set_names(c("Day", paste0("Price", LETTERS[1:3])))
# A tibble: 7 x 4
# Day PriceA PriceB PriceC
# <dbl> <dbl> <int> <int>
#1 1.00 NA NA 21
#2 2.00 NA NA 22
#3 3.00 NA 12 23
#4 4.00 NA 13 24
#5 5.00 7.00 14 25
#6 6.00 8.00 15 26
#7 7.00 9.00 16 27
我有一个从 JSON 获得的不等长列表的列表,我想将其合并为单个数据帧或一系列数据帧。例如,假设这是在我原来的 JSON:
上使用 fromJSON 的结果mylist <- list(
list(
volume = array(1:6, dim=c(3,2)),
price = array(c(1,2,3,7,8,9), dim=c(3,2)),
name = 'A'
),
list(
volume = array(1:10, dim=c(5,2)),
price = array(c(1:5,12:16), dim=c(5,2)),
name = 'B'
),
list(
volume = array(1:14, dim=c(7,2)),
price = array(c(1:7,21:27), dim=c(7,2)),
name = 'C'
)
)
价格和交易量列表的长度不等,我想处理数据时假定给定变量的 n 个观测值是系列中的最后 n 个条目。因此,对于每个数据列表,我基本上都想丢弃第一列并使数据底部对齐。因此,一种表示价格数据的方法如下:
tribble(
~Day, ~PriceA, ~PriceB, ~PriceC,
#---|--------|--------|---------
1L, NA, NA, 21,
2L, NA, NA, 22,
3L, NA, 12, 23,
4L, NA, 13, 24,
5L, 7, 14, 25,
6L, 8, 15, 26,
7L, 9, 16, 27
)
如果这样做,我需要为卷创建一个单独的 table。我对表示最终数据集的其他方式持开放态度,例如在数据框中使用嵌套列。
有人知道如何优雅地执行此操作吗?让我特别困惑的是使用 purrr/map 对涉及的二级列表进行操作。
这是一个使用tidyverse
library(tidyverse)
out <- mylist %>%
transpose %>%
map(~ if(all(lengths(.x) == 1)) unlist(.x) else
map(.x, as_tibble) %>%
reduce(full_join, by = 'V1') %>%
mutate_all(funs(.[order(!is.na(.))])))
现在,我们可以提取 list
个元素
out$price %>%
set_names(c("Day", paste0("Price", LETTERS[1:3])))
# A tibble: 7 x 4
# Day PriceA PriceB PriceC
# <dbl> <dbl> <int> <int>
#1 1.00 NA NA 21
#2 2.00 NA NA 22
#3 3.00 NA 12 23
#4 4.00 NA 13 24
#5 5.00 7.00 14 25
#6 6.00 8.00 15 26
#7 7.00 9.00 16 27