2014-01-17 173 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 ...