r import csv跳过第一行和最后一行

时间:2014-01-17 17:27:36

标签: r csv numeric r-factor

我知道很多帖子已经像我一样回答了类似的问题,但我现在已经试着弄清楚了2天,看起来好像我没看到这里的图片......

我的csv文件看起来像这样:

Werteformat:                wertabh. (Q)
Werte:  
01.01.76 00:00  0,363
02.01.76 00:00  0,464
...
31.12.10 00:00  1,03
01.01.11 00:00  Lücke

我想用数据创建一个时间轴,但我无法正确导入csv。

到目前为止我已经尝试过了:

data<-read.csv2(file, 
            header = FALSE, 
            sep = ";", 
            quote="\"", 
            dec=",", 
            col.names=c("Datum", "Abfluss"), 
            skip=2, 
            nrows=length(strs)-2, 
            colClasses=c("date","numeric"))`

但后来我

"Fehler in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
  scan() erwartete 'a real', bekam 'L�cke'"

所以我删除colClasses并且它有效,我摆脱了所有不需要的行。但是:一切都在因素中。所以我使用as.numeric

Abfluss1<-as.numeric(data$Abfluss)

知道我可以用Abfluss 1计算,但是这些值与原来的csv完全不同...

Abfluss1
    [1]   99  163  250  354  398  773  927  844  796  772 1010 1468 1091  955  962  933  881  844  803  772  773  803 1006  969  834  779  755
   [28]  743  739 

我哪里出错?!我真的很感激一些有用的提示。 顺便说一句,我正在处理的文件可以在这里下载: http://ehyd.gv.at/#

只需点击其中一个蓝色三角形,然后下载“Q-Tagesmittel”

1 个答案:

答案 0 :(得分:4)

首先,文件编码似乎有问题。下载的文件显然是拉丁语编码,无法正确识别,为什么它显示L�cke而不是Lücke

encoding = "latin1"

其次,你的例子似乎不可重复:从我的理解你想跳过28行(也许我错了)。并且在您的示例中未声明变量strs。从我的理解,你想跳过28行,并留下最后一行,所以总共

nrows = length( readLines( file ) ) - 29

最后,您遇到了这个常见的R问题:How to convert a factor to an integer\numeric without a loss of information?。整个列被解释为character向量,因为并非所有元素都可以解释为numeric。在向data.frame添加character向量时,默认情况下会将其转换为factor列。虽然没有必要,但如果指定了正确的行范围,则可以使用

来避免这种情况
stringsAsFactors = FALSE

所以总的来说:

f <- readLines("Q-Tagesmittel-204586.csv")
df <- read.csv2(
  text   = f, 
  header = FALSE,
  sep = ";",
  quote="\"", 
  dec=",", 
  skip=28,
  col.names=c("Datum", "Abfluss"),
  nrows = length(f) -29,
  encoding = "latin1",
  stringsAsFactors = FALSE
)

哦,如果你想将Datum列的下一步转换为日期对象,实现这一目的的一种方法是

df$Datum <- strptime( df$Datum, "%d.%m.%Y %H:%M:%S" )

str(df)
'data.frame':   12784 obs. of  2 variables:
 $ Datum  : POSIXlt, format: "1976-01-01" "1976-01-02" "1976-01-03" "1976-01-04" ...
 $ Abfluss: num  0.691 0.799 0.814 0.813 0.795 0.823 0.828 0.831 0.815 0.829 ...