我想将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]的表格(其中31是列数,n是文件中的总行数):
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"))
但它不像我上面所描述的那样有用。有没有办法可以做到这一点?谢谢你的帮助。
答案 0 :(得分:4)
您可以使用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
答案 1 :(得分:0)
另一种方式是
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列。