我想读取R中的一个文件,作为一个包含奇数格式信息的文件的表。
文件data.txt的数据写为:
04001400 HI 34.50 118.27 19480701 08 LST
0 0 0 0 0 0 0 0 0 0 0 0
MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480801 08 LST
0 0 0 0 0 0 0 0 0 0 0 0
MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480901 08 LST
0 0 0 0 0 0 0 0 0 0 0 0
MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
第一个数字是站号,HI是一个案例,第三个和第四个数字是经纬度坐标,另一个数字是年、月、日,另一个数字(08)是时区,后面跟着LST表示时间范围。下面的24个数字,或者在上面的例子中,0和MIS是特定区域和时间的值。我正在尝试将文件的内容存储为这种类型的维度n x 31格式的表
04001400 HI 34.50 118.27 19480701 08 LST 0 0 0 0 0 0 0 0 0 0 0 0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480801 08 LST 0 0 0 0 0 0 0 0 0 0 0 0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480901 08 LST 0 0 0 0 0 0 0 0 0 0 0 0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
我已经尝试过基于函数read.table以这种方式进行编码:
data <- read.table("data.txt", sep = c("\b", "\t", "\n"))
但它并不像我上面描述的那样工作。有没有办法让我做到这一点?谢谢你的帮助。
发布于 2012-03-19 22:12:20
您可以使用scan
读取多行数据,特别是因为它是一种特定的格式。
dat <- data.frame(scan("data.txt",
what = as.list(c("character","character","number","number",
"character","number","character",
rep("character",24))),
multi.line=TRUE))
names(dat) <- paste("V",1:ncol(dat),sep="")
这给了我们
> dat
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16
1 04001400 HI 34.50 118.27 19480701 08 LST 0 0 0 0 0 0 0 0 0
2 04001400 HI 34.50 118.27 19480801 08 LST 0 0 0 0 0 0 0 0 0
3 04001400 HI 34.50 118.27 19480901 08 LST 0 0 0 0 0 0 0 0 0
V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31
1 0 0 0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
2 0 0 0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
3 0 0 0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
> dim(dat)
[1] 3 31
当然,您可以为列指定更具信息性的名称。
编辑:
正如Josh在注释中指出的那样,我的what
参数的格式错误,导致所有列都作为字符导入,而不是一些作为字符导入,另一些作为数字导入。应该是这样的:
dat <- data.frame(scan("data.txt",
what = list(character(), character(), numeric(), numeric(),
character(), numeric(), character(),
character(), character(), character(), character(),
character(), character(), character(), character(),
character(), character(), character(), character(),
character(), character(), character(), character(),
character(), character(), character(), character(),
character(), character(), character(), character()),
multi.line=TRUE))
names(dat) <- paste("V",1:ncol(dat),sep="")
这给出了更合适的:
> str(dat)
'data.frame': 3 obs. of 31 variables:
$ V1 : Factor w/ 1 level "04001400": 1 1 1
$ V2 : Factor w/ 1 level "HI": 1 1 1
$ V3 : num 34.5 34.5 34.5
$ V4 : num 118 118 118
$ V5 : Factor w/ 3 levels "19480701","19480801",..: 1 2 3
$ V6 : num 8 8 8
$ V7 : Factor w/ 1 level "LST": 1 1 1
$ V8 : Factor w/ 1 level "0": 1 1 1
$ V9 : Factor w/ 1 level "0": 1 1 1
$ V10: Factor w/ 1 level "0": 1 1 1
$ V11: Factor w/ 1 level "0": 1 1 1
$ V12: Factor w/ 1 level "0": 1 1 1
$ V13: Factor w/ 1 level "0": 1 1 1
$ V14: Factor w/ 1 level "0": 1 1 1
$ V15: Factor w/ 1 level "0": 1 1 1
$ V16: Factor w/ 1 level "0": 1 1 1
$ V17: Factor w/ 1 level "0": 1 1 1
$ V18: Factor w/ 1 level "0": 1 1 1
$ V19: Factor w/ 1 level "0": 1 1 1
$ V20: Factor w/ 1 level "MIS": 1 1 1
$ V21: Factor w/ 1 level "MIS": 1 1 1
$ V22: Factor w/ 1 level "MIS": 1 1 1
$ V23: Factor w/ 1 level "MIS": 1 1 1
$ V24: Factor w/ 1 level "MIS": 1 1 1
$ V25: Factor w/ 1 level "MIS": 1 1 1
$ V26: Factor w/ 1 level "MIS": 1 1 1
$ V27: Factor w/ 1 level "MIS": 1 1 1
$ V28: Factor w/ 1 level "MIS": 1 1 1
$ V29: Factor w/ 1 level "MIS": 1 1 1
$ V30: Factor w/ 1 level "MIS": 1 1 1
$ V31: Factor w/ 1 level "MIS": 1 1 1
发布于 2012-03-19 22:17:27
另一种方式是
a <- read.table("sample.txt", fill=T);
aseq <- seq(1, dim(a)[1], by=3)
x <- data.frame(a[aseq, 1:7], a[aseq+1,], a[aseq+2,])
1:7是必需的,因为read.table()创建了NA列。
https://stackoverflow.com/questions/9778482
复制