Чтение файла в R - PullRequest
       7

Чтение файла в R

2 голосов
/ 20 марта 2012

Я хотел бы прочитать файл в 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"))

Но это не работает, как я описал выше. Есть ли способ, которым я могу это сделать? Спасибо за вашу помощь.

Ответы [ 2 ]

4 голосов
/ 20 марта 2012

Вы можете использовать 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

Можно, конечно, дать более информативные имена столбцам.

EDIT:

Как отмечает Джош в комментариях, мой аргумент 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
0 голосов
/ 20 марта 2012

Другой способ -

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.

...