使用列名和0行初始化一个空的tibble

60

我有一个列名向量叫做tbl_colnames

我想创建一个tibble,它有0行和tbl_colnames的长度个列。

我找到的最好的方法是...

tbl <- as_tibble(data.frame(matrix(nrow=0,ncol=length(tbl_colnames))))

然后我想给这些列命名,所以...

colnames(tbl) <- tbl_colnames.

我的问题:有没有更优雅的方法来完成这个任务?

例如tbl <- tibble(colnames=tbl_colnames)


2
tibble的列具有数据类型。你是想让所有的列都是数字吗?另外,你打算如何处理这个空的tibble呢?你不会试图向其中添加行吧?因为那样非常低效。最好先按列构建数据。提供更多上下文会更有帮助。 - MrFlick
1
你不需要用 data.frame 包装。只需使用 as_tibble(matrix(. - akrun
我有一个包含5个列表的列表,想要将它们全部合并成一个tibble。我的想法是从一个空的tibble开始,然后循环遍历列表,并逐个将它们rowbind到初始化的tibble中。 - colorlace
6个回答

57
my_tibble <- tibble(
  var_name_1 = numeric(),
  var_name_2 = numeric(),
  var_name_3 = numeric(),
  var_name_4 = numeric(),
  var_name_5 = numeric()
)

没有尝试过,但我猜如果您用其他类别(例如character())初始化长度为0的数字向量,它也能正常工作。

这个 SO 问题解释了如何使用其他R库来实现它。

根据这个tidyverse的问题,tribbles不支持这个功能。


1
谢谢。我希望在提问时能直接使用“tbl_colnames”向量,但确实这是一种方法(虽然有点繁琐)。无论如何,对于其他寻求不同初始化tibbles方法的人来说,这可能会有所帮助。 - colorlace
我喜欢这个答案,因为它很明确。一眼就可以看出你正在创建一个具有特定列名和数据类型的空表。 - Andrew Brēza

35

如果您想合并一个 tibbles 列表,您可以将变量赋值为 NULL,然后使用 bind_rows 与其他 tibbles 进行组合。

res = NULL
for(i in tibbleList)
   res = bind_rows(res,i)

然而,更加高效的做法是:

bind_rows(tibbleList) # combine all tibbles in the list

1
谢谢您的回答。它是一个列表的列表(而不是tibbles的列表),但这似乎仍然有效! - colorlace
5
这个回答针对的是一个评论,该评论与此页面的标题和问题只有外围联系。 - Aren Cambre
@ArenCambre 我很感激。作为一个相对新手的R语言使用者,看到R语言中更好的解决方法似乎非常相关。所提出的问题和我一样,但事实证明还有更好的方式。 - David
@David 没问题。我只是想明确一下这并没有回答问题。虽然它可能有价值,但这个问题应该被修改或者作者应该选择一个不同的答案作为采纳答案。 - Aren Cambre
作为一个R的新手,这是我所问的问题,但这是错误的问题。然而,如果没有人回答这个问题,然后我看到它,我就不会意识到自己在问错问题。没有必要创建一个空的tibble,也不是最高效/整洁的方式来处理事情。这就像很多答案提出更Pythonic的解决方案来回答Python问题,但却内含有错误的假设。它们仍然与所问的问题高度相关。 - David

25

对于仍然想要以优雅的方式创建一个0行tibble并由字符向量tbl_colnames提供列名的人:

tbl_colnames %>% purrr::map_dfc(setNames, object = list(logical()))

或者:

tbl_colnames %>% purrr::map_dfc(〜tibble :: tibble( !!。x:= logical()))

或者:

tbl_colnames %>% rlang :: rep_named(list(logical()))%>% tibble :: as_tibble()

当然,这会导致每个列的类型都是逻辑型。


10

以下命令将创建一个 tibble,其中行数为 0,变量(列)的名称使用 tbl_colnames 的内容命名

tbl <- tibble::tibble(!!!tbl_colnames, .rows = 0, .name_repair = ~ tbl_colnames)

当我尝试这个时,我得到了奇怪的带引号的列名。colnames(tbl) 打印出 ""var_name_1"" ""var_name_2"" 等等... - mandmeier
在我的情况下,函数调用添加了双引号。我使用参数.name_repair删除了这些引号:.name_repair = \(x) str_remove_all(x, '"') - dzegpi

8

我可能有点晚到,但是对于未来的读者:

as_tibble(matrix(nrow = 0, ncol = length(tbl_colnames)), .name_repair = ~ tbl_colnames)

.name_repair 让你可以在同一个函数中给列命名。


7
你可以使用 readr::read_csv, 此函数支持从字符串中读取数据。你可以通过此函数来控制列名和数据类型,例如:
tbl_colnames <- c("one", "two", "three", "c4", "c5", "last")
read_csv("\n", col_names = tbl_colnames) # all character type
read_csv("\n", col_names = tbl_colnames, col_types = "lcniDT") # various types

这是一首非常棒的两行诗。 - its.me.adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接