将dat文件导入R

62

提前道歉,这个问题可能很简单。我正在尝试使用以下代码将一个网站上的.dat文件导入到R中:

www = "http://www.nilu.no/projects/ccc/onlinedata/ozone/CZ03_2009.dat"
data <- read.delim(www, header = TRUE, sep="\t") 

我想访问数据框架中的值部分,但是我不确定数据框架的维度,如果我键入ncol(data),它返回1,而我预期应该是3。如何访问这个数据框架的“第三”列?

1个回答

74

dat文件在实际数据之前有一些额外的信息行。使用skip参数跳过它们:

read.table("http://www.nilu.no/projects/ccc/onlinedata/ozone/CZ03_2009.dat", 
           header=TRUE, skip=3)

如果您对数据集不熟悉,可以通过首先使用 readLines 检查几行来轻松检查:

readLines("http://www.nilu.no/projects/ccc/onlinedata/ozone/CZ03_2009.dat", 
          n=10)
# [1] "Ozone data from CZ03 2009"   "Local time: GMT + 0"        
# [3] ""                            "Date        Hour      Value"
# [5] "01.01.2009 00:00       34.3" "01.01.2009 01:00       31.9"
# [7] "01.01.2009 02:00       29.9" "01.01.2009 03:00       28.5"
# [9] "01.01.2009 04:00       32.9" "01.01.2009 05:00       20.5"

从这里我们可以看到实际数据从[4]开始,因此我们知道要跳过前三行。

更新

如果你真的只想要Value列,你可以这样做:

as.vector(
    read.table("http://www.nilu.no/projects/ccc/onlinedata/ozone/CZ03_2009.dat",
               header=TRUE, skip=3)$Value)

再次强调,readLines 函数在帮助我们确定将要导入的列的实际名称方面非常有用。

但是我认为,与读取整个数据集并稍后提取相比,这种方法并没有太多优势。


谢谢。那么,我该如何定义一个名为“Value”的变量?data$Value不起作用,而ncol(data)等于1?我尝试输入as.vector(data$Value),但R返回NULL。 - KatyB
1
请再次查看示例。您可能仍然使用sep="\t",这将把所有内容放入单个列的data.frame中;您要读取的实际文件是由空格而不是制表符分隔的。因此,如果您想要完整的数据集,请使用我答案上部分的解决方案。如果您只想要作为单独向量的Values列,请使用更新后的部分。希望这有意义。 - A5C1D2H2I1M1N2O1R2T1
谢谢,我漏掉了解决方案的那一部分。现在运行得很好。 - KatyB
你为什么要跳过三个? - Mona Jalal
@MonaJalal,请看回答中的第一句话。 - A5C1D2H2I1M1N2O1R2T1
注意:我尝试使用read.tablereadLines加载一个.dat文件(与OP不同),结果观察到了不同的观测值(行数)。read.table只读取了原始数据的20305行,而readLines读取了所有23308行(如预期)。我仍然不知道原因,但这是事实。 - Marina

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