2012-07-26 265 views
35

为了简化这个问题,提前道歉。我试图导入从网站.dat文件分为R用下面的代码:将dat文件导入R

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

我要访问的data.frame的价值部分,但是,我不能确定有关数据的尺寸.frame,如果我键入ncol(data),它返回1,我期待3。我如何访问这个data.frame的“第三”列?

+1

+1 for [reproducible example](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 – Andrie 2012-07-26 07:16:12

回答

39

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是帮助我们找出的实际名称有用我们将导入的列。

但我没有看到很多这样做的优势在于在整个数据集中读取和稍后提取。

+0

谢谢。因此,我将如何定义一个名为'Value'的变量。数据$值不起作用,并且ncol(数据)等于1?我输入as.vector(data $ Value),R返回NULL。 – KatyB 2012-07-26 07:29:22

+1

请再看一下这个例子。你可能*仍*具有'sep =“\ t”',它将把所有内容放到一个单独的列data.frame中;您尝试读取的实际文件由*空格*分隔,而不是*制表符*。所以,如果您想要完整的数据集,请在答案的上半部分使用解决方案。如果您只想将'Values'列作为单独的矢量,请在更新后使用该部分。我希望这是有道理的。 – A5C1D2H2I1M1N2O1R2T1 2012-07-26 07:36:16

+0

谢谢我错过了解决方案的一部分。很棒。 – KatyB 2012-07-26 07:38:55