使用来自向量的列名称创建空 tibble/data 框架

Create empty tibble/data frame with column names coming from a vector

我想创建一个空数据框,其中列名来自字符向量。

例如,如果这是我的矢量:

 vec <- letters[1:3]

我想创建一个如下所示的空数据框:

 df <- tibble('a' = character(), 'b' = character(), 'c' = character())

但是,我想遍历向量中的项目来填充数据框名称,而不必手动指定每个项目。实际上我的矢量有 40 多个名字。

我已经尝试了以下方法,但它们不起作用:

 df <- tibble(vec[1:3])
 df <- tibble(vec)
 df <- tibble(for (i in 1:3){
   vec[i]
 })

如有任何帮助,我们将不胜感激!

你可以做到

library(tibble)

tb <- as_tibble(matrix(nrow = 0, ncol = length(vec), dimnames = list(NULL, vec)))

tb
# A tibble: 0 x 3
# ... with 3 variables: a <lgl>, b <lgl>, c <lgl>

您可以创建一个命名向量,vec,其中第一个参数设置您想要的列的类型。 rep("", 3) 行表示我想要三个字符列。那么第二个参数就是列名的向量。

使用dplyr::bind_rows将其转换为一行的tibble。然后 [0, ] 选择零行,将其留空。

使用此方法,您可以轻松控制每一列的数据类型。

library(dplyr)

vec <- setNames(rep("", 3), letters[1:3])
bind_rows(vec)[0, ]

# A tibble: 0 x 3
# ... with 3 variables: a <chr>, b <chr>, c <chr>

如果转置命名向量,也可以使用 as_tibble。我想我使用 bind_rows 因为我通常加载 dplyr 而不是 tibble.

library(tibble)

vec <- setNames(rep("", 3), letters[1:3])
as_tibble(t(vec))[0, ]

# A tibble: 0 x 3
# ... with 3 variables: a <chr>, b <chr>, c <chr>

如果您知道所有列都是单一类型(例如,字符),您可以这样做。

vec <- letters[1:3]
df <- bind_rows(setNames(rep("", length(vec)), vec))[0, ]

Adam 解决方案的一个变体是创建适当类型的命名列表,例如,

n = length(vec)
tmpl = setNames(rep(list(character()), n), head(letters, n))

这反映了 data.frame 或 tibble 的底层结构 -- 等长向量的命名列表。然后

as.data.frame(tmpl, stringsAsFactors = FALSE)
tibble::as_tibble(tmpl)

亚当想法的另一种变体:

as_tibble(sapply(vec, \(x) character()))

# A tibble: 0 x 3
# ... with 3 variables: a <chr>, b <chr>, c <chr>