首页 > 解决方案 > 如何使用 bind_rows 将多个数据框与命名为日期的行绑定?我收到错误:bind_rows_(x, .id) 中的错误:参数 1 必须有名称

问题描述

我有多个 xts 类的数据框,收集在一个列表中,我想使用 bind_rows 将其组合到一个数据框,但保留行名。

library(xts)
library(dplyr)

data <- data.frame(a = c(1, 2, 3),
                   b = c(4, 5, 6))

dates <- as.Date(c("2019-01-31", "2019-02-28", "2019-03-31"))

假设具有以下三个 xts 数据帧是起点:

ts_data_1 <- as.xts(data[1, ], order.by = dates[1])
ts_data_2 <- as.xts(data[2, ], order.by = dates[2])
ts_data_3 <- as.xts(data[3, ], order.by = dates[3])

ts_list <- list(ts_data_1, ts_data_2, ts_data_3)

bind_rows(ts_list)

但是这不起作用并返回错误:“bind_rows_(x, .id) 中的错误:参数 1 必须有名称”。

我想这个错误是由于命名的行而发生的。我不想将它们移到新的列或摆脱它们。有没有一种巧妙的方法来做到这一点?

标签: rdplyrxts

解决方案


如错误所述,它需要 data.frame/tibble 等。一种选择是创建一个tibble

library(tibble)
map_df(ts_list, as_tibble)

注意:使用上述内容,行名信息(indexof xts)将丢失,因为tibble不支持自定义行名

NOTE2:xts对象有列名

colnames(ts_list[[1]])
#[1] "a" "b"

它不是错误的来源

如果我们也在另一个例子上这样做,得到同样的错误

bind_rows(list(matrix(1:5, dimnames = list(NULL, "a")),
    matrix(1:10, dimnames = list(NULL, "a"))))

错误:参数 1 必须有名称

请注意,这两个矩阵都有列名。它与列名无关,但


一个base R选择是

do.call(rbind, ts_list)

推荐阅读