R: Создать пустой тиббл / фрейм данных с именами столбцов из вектора - PullRequest
1 голос
/ 17 октября 2019

Я хотел бы создать пустой фрейм данных, в котором имена столбцов взяты из символьного вектора.

например, если бы это был мой вектор:

 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]
 })

Любая помощь по этому вопросу будет принята с благодарностью!

Ответы [ 4 ]

1 голос
/ 17 октября 2019

Еще один вариант идеи Адама:

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

# A tibble: 0 x 3
# ... with 3 variables: a <chr>, b <chr>, c <chr>
1 голос
/ 17 октября 2019

Вы можете создать именованный вектор, vec, где первый аргумент задает тип столбца, который вы хотите. Строка rep("", 3) говорит, что я хочу три символьных столбца. Тогда вторым аргументом является вектор имен столбцов.

Используйте dplyr::bind_rows, чтобы преобразовать это в таблицу с одной строкой. Затем [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, ]
1 голос
/ 17 октября 2019

Вариант решения Адама состоит в создании именованного списка соответствующих типов, например,

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)
1 голос
/ 17 октября 2019

Вы можете сделать

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>

...