Чтение таблицы из сырого текстового файла в R - PullRequest
1 голос
/ 29 марта 2012

У меня есть текстовый файл с несколькими первыми строками, которые не требуются, а затем есть таблица, похожая на эту

-Шифеновая линия-
| col1 | col2 | col3 col4 col5 |
-Сифеновая линия-
| 1 | 14:24:21 22.03.2012 | 0 0 1 |
| 2 | 14:24:21 22.03.2012 | 1 · 0 |

  1. Col1, Col2 разделены | но col3, col4 и col5 просто разделены пробелом.
  2. Тип данных должен поддерживаться как дата col2 и col3,4,5 как число?
  3. Строка 2, Col4 - точка, поэтому ее следует прочитать до NA
  4. Строки переноса начинаются и заканчиваются - - -

Вопрос:
1. Я могу использовать сканирование, но как избежать чтения "|" и "-"?
2. Я могу пропустить несколько верхних строк, но как пропустить, скажем, 50-е строки в дополнение к верхним нескольким строкам.

Ответы [ 2 ]

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

Вы можете прочитать его как таблицу, как есть, затем разделить столбец и рекомбинировать.

txt <- "| col1 | col2 | col3 col4 col5 |
| 1 | 2:24:21 PM 3/22/2012 | 0 0 1 |
| 2 | 2:24:21 PM 3/22/2012 | 1 · 0 |"

x <- read.table(text = txt, sep = "|", header = TRUE, stringsAsFactors = FALSE)

## drop unnecessary columns from the original sep split
x <- x[,-c(1,ncol(x))]

## split the desired column by the spaces, result is a character matrix
## including an unnecessary first column
split.col3 <- do.call("rbind", strsplit(x[,3], " "))

## bind to the original, dropping the unneeded columns
cbind(x[,-3], split.col3[,-1])
  col1                   col2 1 2 3
1    1  2:24:21 PM 3/22/2012  0 0 1
2    2  2:24:21 PM 3/22/2012  1 · 0

Я избегал ссылаться на исходные имена столбцов, так как вы сказали, что хотите пропустить эти строки.Просто добавьте header = FALSE и skip = 50 к вызову read.table, а затем добавьте любые имена столбцов, которые имеют смысл впоследствии.

Кроме того, вы можете лишить "."из колонок, где это необходимо, конвертируйте в форматы даты и времени или числа, как требуется.Используйте colClasses в read.table, если вы знаете их заранее.Для меня имеет смысл разбить это на несколько шагов, а не пытаться делать все это с помощью одной функции чтения.

1 голос
/ 29 марта 2012

Это можно сделать в три этапа. (1) Считайте в файле все, используя "|" в качестве разделителя, (2) создайте новый файл только с тремя столбцами (содержащимися как один), (3) затем прочитайте их обратно, используя разделитель пробелов. Следующий код должен помочь вам в этом. Могут потребоваться изменения: имена файлов, V4 имя столбца и переход в соответствующий каталог (getwd/setwd).

a <- read.delim("a.txt", FALSE, sep="|")
write.table(a$V4, file="b.txt", quote=FALSE, row.names=FALSE, col.names=FALSE)
b <- read.delim("b.txt", FALSE, sep=" ")

Объедините соответствующие столбцы a и b, и тогда все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...