我知道很多帖子已经像我一样回答了类似的问题,但我现在已经试着弄清楚了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”
答案 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 ...