2

我想读取 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是case,第三和第四个数字是经纬度坐标,另一个数字是年月日,另一个数字(08)是时区,后面是LST的意思大体时间。以下 24 个数字或上例中的 0 和 MIS 是特定区域和时间的值。我正在尝试以这种维度 [nx 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"))

但它不像我上面描述的那样工作。有没有办法我可以做到这一点?感谢您的帮助。

4

2 回答 2

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
于 2012-03-19T22:12:20.387 回答
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 列。

于 2012-03-19T22:17:26.517 回答