Чтение csv с датами и числами

У меня проблема, когда я импортирую CSV-файл с помощью R:

примеры строк для импорта:

2010-07-27;91
2010-07-26;93
2010-07-23;88

Я использую утверждение:

data <- read.csv2(file="...", sep=";", dec=".", header=FALSE)

когда я пытаюсь объединить эти данные с другими данными, полученными в результате статистического анализа с использованием cbind, дата отображается как целое число, потому что она была импортирована как фактор.

Если я попытаюсь показать это как строку, используя as.character, числовые данные также преобразуются в символы, поэтому они непригодны для статистических процедур.


person keanu    schedule 24.08.2010    source источник


Ответы (3)


Используйте аргумент colClasses:

data <- read.csv2(file="...", sep=";", dec=".", header=FALSE,
     colClasses=c("Date",NA))

NA означает "действовать по умолчанию"

После импорта вы можете преобразовать factor в Date с помощью

data[[1]] <- as.Date(data[[1]])
person Marek    schedule 24.08.2010

Возможно, вы хотите преобразовать значения символов в осмысленные значения времени. В этом случае объекты времени POSIXt являются хорошим выбором.

Учитывая ваш файл данных, я бы сделал что-то вроде.

data <- read.table(file="...", sep = ";", as.is = TRUE)
data[,1] <- strptime(data[,1], "%Y-%m-%d")

Посмотрите strptime в справке для более подробной информации.

ПРИМЕЧАНИЕ. Если вы собираетесь указать все свойства файла, просто используйте read.table. Единственная цель всех остальных версий read.xxx — упростить выражение, поскольку установлены значения по умолчанию. Здесь вы использовали read.csv2, потому что по умолчанию он равен sep = ';'. Поэтому не указывайте его снова. Отсутствие необходимости указывать, что это единственная причина существования команды. Лично я использую только read.table, потому что никогда не могу вспомнить имена/значения по умолчанию для всех вариантов. В вашем случае это также самый короткий вызов, потому что он удовлетворяет вашим значениям по умолчанию для заголовка и dec.

person John    schedule 24.08.2010
comment
когда я запускаю вашу вторую строку, я получаю сообщение об ошибке, например «предоставлено 9 переменных для замены 1 переменной». Однако, когда я оборачиваю strptime в as.POSIXct(...), т.е. делаю as.POSIXct(strptime(data[,1], "%Y-%m-%d") , кажется, что это работает. - person Andre Holzner; 30.01.2012
comment
Если data[,1] представляет собой вектор строк символов формата c(2010-07-23,...), то то, что я написал, работает. Что вообще значит работать? похоже, вы просто конвертируете результат POSIXlt по умолчанию, и у вас есть какая-то другая функция, не упомянутая здесь, использующая значение POSIXlt. Это нормально, это просто другой результат. Это не значит, что то, что есть, не работает. POSIXlt и POSIXct относятся к классу POSIXt (о котором я упоминал). - person John; 30.01.2012
comment
Именно для этого и предназначен read.csv(...colClasses...)! Смотрите ответ Марека. Выполнение преобразования во время чтения с помощью colClasses лучше, чем этот ответ, потому что оно не тратит много временной памяти. (Просто сделайте gc(reset=TRUE) после этого.) Кроме того, это более разборчиво. - person smci; 12.07.2012
comment
Я не знаю о «многом» временной памяти, и время от времени я использую colClasses. Но иногда вы хотите работать с несколькими классами. Кроме того, если вы просто хотите изменить несколько столбцов из группы, и они находятся в странных местах, вам потребуется создать векторы для классов столбцов, которые либо требуют дополнительного кода, либо подсчитывают целую кучу записей, чтобы убедиться, что вы попали в нужное место. один. И, конечно, read.table() имеет аргумент colClasses. - person John; 12.07.2012
comment
strptime() имеет дополнительное преимущество, заключающееся в возможности чтения часов и минут, как и в strptime(df[[1]], "%Y-%m-%d %H:%M"), если это необходимо. - person fbmd; 12.12.2012

Добавьте as.is=TRUE к вызову read.csv.

person mbq    schedule 24.08.2010