2014-01-17 175 views
2

我知道很多帖子已经回答了类似我的问题,但我试图找出它2天现在,似乎我没有看到这里的图片。 ..r导入csv跳过第一行和最后一行

我得到这个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

使用'stringsAsFactors = FALSE'如果你不想因素,并转换为数值正确地做'as.numeric(as.character (yourfacto r))' – eddi

+0

在读取文件时设置'na.strings =“Lücke”'。 – Roland

+0

我现在已经包括了两行('na。strings'和'stringsAsFactors'),如上所示,现在数据$ Abfluss是一个字符。当用as.numeric(as.character(你的因子))转换为数字时,'我只为每一行获得NAs ... – HairyFloh

回答

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。当将一个character向量添加到data.frame时,默认情况下会将其转换为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 ...