read.table() читать числовое значение как целое число в R

Я использую Data <- read.table("file", head=TRUE, sep=";") для чтения моего файла.

head моего файла выглядит так:

         Date     Time Global_active_power Global_reactive_power Voltage Global_intensity
66637 2007-02-01 00:00:00               0.326                 0.128 243.150            1.400
66638 2007-02-01 00:01:00               0.326                 0.130 243.320            1.400
66639 2007-02-01 00:02:00               0.324                 0.132 243.510            1.400
66640 2007-02-01 00:03:00               0.324                 0.134 243.900            1.400
66641 2007-02-01 00:04:00               0.322                 0.130 243.160            1.400
66642 2007-02-01 00:05:00               0.320                 0.126 242.290            1.400
      Sub_metering_1 Sub_metering_2 Sub_metering_3
66637          0.000          0.000              0
66638          0.000          0.000              0
66639          0.000          0.000              0
66640          0.000          0.000              0
66641          0.000          0.000              0
66642          0.000          0.000              0

Однако, если я попробую typeof(Data$Global_reactive_power), он покажет integer (должно быть numeric).

Я не понимаю, почему это происходит. Я пробовал много методов, но почему-то ни один из них не работает, может ли кто-нибудь помочь мне в этом?

Мой файл находится здесь: https://d396qusza40orc.cloudfront.net/exdata%2Fdata%2Fhousehold_power_consumption.zip


person Ginger    schedule 05.09.2014    source источник
comment
Вы можете прочитать свои данные, как вы сделали выше, и использовать Data$Global_reactive_power <- as.numeric(Data$Global_reactive_power) после, или вы можете вручную указать класс каждого столбца в своем вызове read.table. См. аргумент colClasses в файле справки для read.table (?read.table).   -  person nrussell    schedule 05.09.2014
comment
Я попробовал as.numeric(Data$Global_reactive_power), однако он попытается представить данные как целое число (хотя атрибуция двойная). Первая строка будет Date Time Global_active_power Global_reactive_power Voltage Global_intensity 66637 01.02.2007 00:00:00 126 43 243,150 1,400   -  person Ginger    schedule 05.09.2014
comment
он изменяет значение 0,326 на 126 и так далее.   -  person Ginger    schedule 05.09.2014
comment
Не могли бы вы предоставить небольшой образец вашего файла (первые несколько строк), чтобы мы могли воспроизвести проблему?   -  person David Robinson    schedule 05.09.2014
comment
Я добавил ссылку на свой файл.   -  person Ginger    schedule 05.09.2014


Ответы (2)


Похоже, что ваши необработанные данные как "?" для пропущенных значений. я смотрел с помощью

is.not.numeric<-function(x) {
    is.na(as.numeric(as.character(x)))
}

head(Filter(is.not.numeric, Data$Global_reactive_power))

Когда R встречает нечисловое значение, такое как "?" в столбце он приводит столбец к фактору. Чтобы вы правильно прочитали свои данные, попробуйте

Data<-read.table("household_power_consumption.txt", 
    header=TRUE, sep=";", na.strings="?")

Теперь

class(Data$Global_reactive_power)
# [1] "numeric"

показывает, что это числовое значение. (Обратите внимание, что вам никогда не нужно использовать typeof. Это говорит вам, как хранятся данные для объекта, но не говорит вам, что объект является. Используйте для этого class()).

person MrFlick    schedule 05.09.2014

В вашем столбце Global_reactive_power есть некоторые нечисловые записи, из-за чего read.table превращает его в фактор. Обратите внимание, что typeof(factor) равно integer.

Откройте файл в текстовом редакторе и найдите записи, которые не являются строго числовыми. Если ваши данные получены из Excel, обязательно удалите все форматирование из столбцов (кроме дат) перед экспортом в текст.

person Hong Ooi    schedule 05.09.2014
comment
или попробуйте which(is.na(as.numeric(as.character(d$Global_reactive_power)))) найти проблемы - person Ben Bolker; 05.09.2014
comment
Я попробовал 'what(is.na(as.numeric(as.character(d$Global_reactive_power))))'), то получил вектор, полный FALSE. - person Ginger; 05.09.2014
comment
@Ginger Команда which() никогда не должна возвращать логические значения, она должна возвращать индексы (целые числа). Вы уверены, что правильно выполнили эту строку кода? - person MrFlick; 05.09.2014