Как преобразовать факторный вектор в POSIXct в ff или ffbase

После чтения большого набора данных с помощью read.csv.ffdf один из столбцов — это время. Например, 2014-10-18 00:01:02 для 1 миллиона строк в этом столбце. Этот столбец является фактором. Как преобразовать его в POSIXct, поддерживаемый ff? Простое использование as.POSIXct() просто превращает значения в NA

Или когда я читаю набор данных в начале, могу ли я указать, что этот столбец будет POSIXct?

Моя цель - получить месяц и дни (или даже час). Поэтому я открыт для решений, отличных от перехода на POSIXct.

Например, у нас есть таблица 9 на 2,

test <- read.csv.ffdf(file="test.csv", header=T, first.rows=-1)

Два столбца: идентификатор (числовой класс) и время (факторный класс).

Вот вывод

structure(list(virtual = structure(list(VirtualVmode = c("integer", 
"integer"), AsIs = c(FALSE, FALSE), VirtualIsMatrix = c(FALSE, 
FALSE), PhysicalIsMatrix = c(FALSE, FALSE), PhysicalElementNo = 1:2, 
    PhysicalFirstCol = c(1L, 1L), PhysicalLastCol = c(1L, 1L)), .Names = c("VirtualVmode", 
"AsIs", "VirtualIsMatrix", "PhysicalIsMatrix", "PhysicalElementNo", 
"PhysicalFirstCol", "PhysicalLastCol"), row.names = c("ID", "time"
), class = "data.frame", Dim = c(9L, 2L), Dimorder = 1:2), physical = structure(list(
    ID = structure(list(), physical = <pointer: 0x000000000821ab20>, virtual = structure(list(), Length = 9L, Symmetric = FALSE), class = c("ff_vector", 
    "ff")), time = structure(list(), physical = <pointer: 0x000000000821abb0>, virtual = structure(list(), Length = 9L, Symmetric = FALSE, Levels = c("10/17/2003 0:01", 
    "12/5/1999 0:02", "2/1/2000 0:01", "3/23/1998 0:01", "3/24/2013 0:00", 
    "5/29/2004 0:00", "5/9/1985 0:01", "6/14/2010 0:01", "6/25/2008 0:02"
    ), ramclass = "factor"), class = c("ff_vector", "ff"))), .Names = c("ID", 
"time")), row.names = NULL), .Names = c("virtual", "physical", 
"row.names"), class = "ffdf")

person MM Cui    schedule 18.10.2014    source источник
comment
Пожалуйста, предоставьте небольшой образец ваших данных с выводом dput(head(data))   -  person Rich Scriven    schedule 18.10.2014
comment
Для преобразования фактора вам нужно сначала выполнить as.character в столбце. Затем вы можете передать это в as.POSIXct.   -  person hrbrmstr    schedule 18.10.2014
comment
Кажется, что после применения as.character столбец по-прежнему является факторным классом. Я думаю, проблема в том, что фф не поддерживает характер.... может быть, я ошибаюсь...   -  person MM Cui    schedule 18.10.2014
comment
K забудьте dput, мы не можем его использовать из-за указателя. Моя вина   -  person Rich Scriven    schedule 18.10.2014


Ответы (2)


Вы можете использовать with from package ffbase, как показано ниже на игрушечном примере. Лучший.

require(ff)
x <- data.frame(id = 1:100000, timepoint = seq(from = Sys.time(), by = "sec", length.out = 100000))
x$timepoint <- as.factor(x$timepoint)

xff <- as.ffdf(x)
class(xff)
require(ffbase)
xff$time <- with(xff, as.POSIXct(as.character(timepoint)), by = 10000)
ramclass(xff$time)
[1] "POSIXct" "POSIXt" 
str(xff[1:10, ])
'data.frame':   10 obs. of  3 variables:
 $ id       : int  1 2 3 4 5 6 7 8 9 10
 $ timepoint: Factor w/ 100000 levels "2014-10-20 09:14:10",..: 1 2 3 4 5 6 7 8 9 10
 $ time     : POSIXct, format: "2014-10-20 09:14:10" "2014-10-20 09:14:11" "2014-10-20 09:14:12" "2014-10-20 09:14:13" ...
person Community    schedule 20.10.2014

Используйте colClasses при чтении данных. например с вашим примером двух столбцов: ID (числовой класс) и time (факторный класс):

test <- read.csv.ffdf(file="test.csv", header=T, first.rows=-1,colClasses = c("integer","POSIXct"))
person HywelMJ    schedule 10.08.2015