在R中,read.table()函数将数值读取为整数。

4

我正在使用 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


您可以像上面那样读取数据,然后使用 Data$Global_reactive_power <- as.numeric(Data$Global_reactive_power),或者在调用 read.table 时手动指定每列的类别。请参阅 read.table 的帮助文件中的 colClasses 参数 (?read.table)。 - nrussell
我尝试使用as.numeric(Data$Global_reactive_power)函数,但它会将数据转换为整数(属性是double类型)。第一行数据如下: 日期 时间 全局有功功率 全局无功功率 电压 全局电流 66637 2007-02-01 00:00:00 126 43 243.150 1.400 - Ginger
它将0.326的值更改为126,依此类推。 - Ginger
1
你能提供一小部分文件的样本(前几行),这样我们就可以重现问题吗? - David Robinson
我添加了我的文件链接。 - Ginger
2个回答

5
似乎你的原始数据中存在“?”表示缺失值。我使用了...
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() 来获取对象是什么类型。)


3

你的Global_reactive_power列中有一些非数字条目,这导致read.table将其转换为因子。请注意,typeof(factor)integer

在文本编辑器中打开文件并查找不是严格数字的条目。如果您的数据来自Excel,请确保在将其导出到文本之前从列中删除所有格式(除日期外)。


或者尝试which(is.na(as.numeric(as.character(d$Global_reactive_power))))来定位问题。 - Ben Bolker
我尝试了'which(is.na(as.numeric(as.character(d$Global_reactive_power))))',它生成了一个全是FALSE的向量。 - Ginger
@Ginger,“which()”命令不应返回逻辑值,而应返回索引(整数)。您确定正确运行了该行代码吗? - MrFlick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接