Создание и заполнение кадра данных для каждой строки из сценария (т.е. без использования отдельных векторов для столбцов) - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь создать фрейм данных из списка «записей», то есть для каждой строки (сравните с загрузкой файла CSV, но теперь из файла сценария R), но все примеры, которые я могу найти, создают фрейм данных из векторов, содержащих отдельные столбцы.

Самое близкое, что я обнаружил, - это начать с пустого фрейма данных, а затем добавить строки, используя rbind и list, но затем исходные имена столбцов теряются, и все столбцы имеют класс символ.

> generations <- data.frame(launch_date=as.Date(integer(), origin="1970-01-01"), generation=character(), stringsAsFactors=FALSE)
> generations
[1] launch_date generation 
<0 rows> (or 0-length row.names)

Все хорошо здесь. А теперь:

> generations <- rbind(generations,list("2010-09-01", "Generation 1"), stringsAsFactors=FALSE)
> generations
  X.2010.09.01. X.Generation.1.
1    2010-09-01    Generation 1
> str(generations)
'data.frame':   1 obs. of  2 variables:
 $ X.2010.09.01.  : chr "2010-09-01"
 $ X.Generation.1.: chr "Generation 1"

Оригинальные имена столбцов и классы пропали: (

Причина, по которой нужно что-то подобное, состоит в том, что хранение данных в отдельных векторах является громоздким и приводит к ошибкам. Идея здесь состояла в том, чтобы использовать rbind с кучей списков, где даты и имена могут поддерживаться вместе (т.е. попарно, для каждой «записи» / строки).

Как go об этом?

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Вы находитесь на (одном из многих возможных) правильном пути с rbind. Потеря имен столбцов происходит из-за того, что вы передаете rbind a list вместо data.frame. Если вместо этого мы передадим ему два data.frame объекта:

Это тот же код инициализации, что и в вашем примере:

generations <- data.frame(launch_date=as.Date(integer(), origin="1970-01-01"), generation=character(), stringsAsFactors=FALSE)

Но теперь мы передаем еще один data.frame в качестве второго аргумента rbind:

generations <- rbind(generations,
                     data.frame(launch_date=as.Date("2010-09-01", origin="1970-01-01"), generation="Generation 1", stringsAsFactors=FALSE))

Сейчас

str(generations)

Возвращает:

'data.frame':   0 obs. of  2 variables:
$ launch_date: 'Date' num(0) 
$ generation : chr 
0 голосов
/ 20 февраля 2020

Я нашел более простой способ выполнить sh это, начиная с матрицы, а затем преобразовать ее в фрейм данных:

generations_matrix <- matrix(data=c(
    "2014-04-01", "Generation 1",
    "2016-06-01", "Generation 2",
    "2018-01-01", "Generation 3"
    ), ncol = 2, dimnames=list(NULL,c("launch_date", "generation")), byrow=TRUE)
generations <- data.frame(
    launch_date=as.Date(generations_matrix[,1]), generation=generations_matrix[,2],
    stringsAsFactors=FALSE)

приводит к следующему:

> generations
  launch_date   generation
1  2014-04-01 Generation 1
2  2016-06-01 Generation 2
3  2018-01-01 Generation 3
> str(generations)
'data.frame':   3 obs. of  2 variables:
 $ launch_date: Date, format: "2014-04-01" "2016-06-01" ...
 $ generation : chr  "Generation 1" "Generation 2" "Generation 3"

Это именно то, что я искал: способ определить и поддерживать фрейм данных в строке на строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...