Связывание строк нескольких фреймов данных, содержащих столбцы интервала классов из пакета lubridate - PullRequest
1 голос
/ 02 февраля 2020

У меня есть список, где каждый элемент представляет собой фрейм данных с одинаковыми именами столбцов, один из столбцов имеет класс Interval (из пакета lubridate). Я хочу связать все отдельные фреймы данных в списке в один фрейм данных. К сожалению, использование rbind и bind_rows приводит столбец интервала в число c, и я получаю следующее предупреждение.

Предупреждающие сообщения: 1: В bind_rows_ (x, .id): векторизованные элементы 'Interval' могут не сохранять свои атрибуты

library(dplyr)
library(lubridate)
#Create sample list length 2 actually list length ~18,000
test <- list(BGC119AP01 = structure(list(participant_code = "BGC119AP01", 
    interval_1 = new("Interval", .Data = 34128000, start = structure(1479427200, class = c("POSIXct", 
    "POSIXt"), tzone = "UTC"), tzone = "UTC")), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -1L), groups = structure(list(
    participant_code = "BGC119AP01", .rows = list(1L)), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame"), .drop = FALSE)), 
    BGC119AP02 = structure(list(participant_code = "BGC119AP02", 
        interval_1 = new("Interval", .Data = 34128000, start = structure(1479427200, class = c("POSIXct", 
        "POSIXt"), tzone = "UTC"), tzone = "UTC")), class = c("grouped_df", 
    "tbl_df", "tbl", "data.frame"), row.names = c(NA, -1L), groups = structure(list(
        participant_code = "BGC119AP02", .rows = list(1L)), row.names = c(NA, 
    -1L), class = c("tbl_df", "tbl", "data.frame"), .drop = FALSE)))

#Attempt bind rows both ending in the above warning.
do.call(rbind, test)
do.call(bind_rows, test) 

OUTPUT Принудительный интервал_1 принудительно приведен удваивается и теряет свои атрибуты

# A tibble: 2 x 2
# Groups:   participant_code [2]
  participant_code interval_1
  <chr>                 <dbl>
1 BGC119AP01         34128000
2 BGC119AP02         34128000
Warning messages:
1: In bind_rows_(x, .id) :
  Vectorizing 'Interval' elements may not preserve their attributes
2: In bind_rows_(x, .id) :
  Vectorizing 'Interval' elements may not preserve their attributes

Это, вероятно, связано с тем, что столбцы интервала класса не являются атомами c векторов. Мне известно, что я мог бы решить эту проблему, сохранив исходные даты начала и окончания, а затем создав столбец интервала после привязки строк, но я хотел бы найти решение, позволяющее мне связывать все отдельные фреймы данных в списке, сохраняя при этом целостность столбца интервала класса и для решения быть масштабируемым до 18 000 строк. Большое спасибо заранее

1 Ответ

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

Есть подсказка, что когда вы делаете do.call(rbind, test) с dplyr загруженным и получаете предупреждение:

Warning messages:
1: In bind_rows_(x, .id) :
  Vectorizing 'Interval' elements may not preserve their attributes

То, что dplyr::bind_rows() на самом деле вызывается, а не base::rbind(), а атрибуты интервала отброшен. Похоже, это происходит, когда объекты являются плитами (tbl или tbl_df класс).

Вы можете избежать этого, используя вместо этого rbind.data.frame():

do.call(rbind.data.frame, test)
# A tibble: 2 x 2
# Groups:   participant_code [1]
  participant_code interval_1                    
* <chr>            <Interval>                    
1 BGC119AP01       2016-11-18 UTC--2017-12-18 UTC
2 BGC119AP02       2016-11-18 UTC--2017-12-18 UTC
...