2013-07-04 5 views
0

Я пытаюсь извлечь таблицы из текстовых файлов и нашел несколько более ранних сообщений здесь, которые адресуют похожие вопросы. Однако ни одна из них не работает эффективно с моей проблемой. Самый полезный ответ, который я нашел это один из моих предыдущих вопросов здесь: R: removing header, footer and sporadic column headings when reading csv fileизвлечение таблицы из текстового файла

Пример фиктивных текстовый файл содержит:

> 
> 
> ############################################################################### 
> 
> # Display AICc Table for the models above 
> 
> 
> collect.models(, adjust = FALSE) 
     model npar AICc DeltaAICc weight Deviance 
13  P1 19 94  0.00  0.78  9 
12  P2 21 94  2.64  0.20  9 
10  P3 15 94  9.44  0.02  9 
2  P4 11 94 619.26  0.00  9 
> 
> 
> ############################################################################### 
> 
> # the three lines below count the number of errors in the code above 
> 
> cat("ERROR COUNT:", .error.count, "\n") 
ERROR COUNT: 0 
> options(error = old.error.fun) 
> rm(.error.count, old.error.fun, new.error.fun) 
> 
> ########## 
> 
> 

Я написал следующий код, чтобы извлечь нужную таблицу:

my.data <- readLines('c:/users/mmiller21/simple R programs/dummy.log') 

top <- '> collect.models\\(, adjust = FALSE)' 
bottom <- '> # the three lines below count the number of errors in the code above' 

my.data <- my.data[-c(grep(bottom, my.data):length(my.data))] 
my.data <- my.data[-c(1:grep(top, my.data))] 
my.data <- my.data[c(1:(length(my.data)-4))] 
aa  <- as.data.frame(my.data) 
aa 

write.table(my.data, 'c:/users/mmiller21/simple R programs/dummy.log.extraction.txt', quote=F, col.names=F, row.name=F) 
my.data2 <- read.table('c:/users/mmiller21/simple R programs/dummy.log.extraction.txt', header = TRUE, row.names = c(1)) 
my.data2 
    model npar AICc DeltaAICc weight Deviance 
13 P1 19 94  0.00 0.78  9 
12 P2 21 94  2.64 0.20  9 
10 P3 15 94  9.44 0.02  9 
2  P4 11 94 619.26 0.00  9 

Я бы предпочел не писать и затем читать my.data для получения нужного кадра данных. До этого шага текущий код возвращает вектор строк для my.data:

[1] "  model npar AICc DeltaAICc weight Deviance" "13  P1 19 94  0.00  0.78  9" 
[3] "12  P2 21 94  2.64  0.20  9" "10  P3 15 94  9.44  0.02  9" 
[5] "2  P4 11 94 619.26  0.00  9" 

Есть ли какой-нибудь способ, которым я могу преобразовать выше вектор строк в кадре данных, как, что в dummy.log.extraction.txt без записи, а затем чтение my.data?

Линия:

aa <- as.data.frame(my.data) 

возвращает следующее, который выглядит как то, что я хочу:

#            my.data 
# 1  model npar AICc DeltaAICc weight Deviance 
# 2 13  P1 19 94  0.00  0.78  9 
# 3 12  P2 21 94  2.64  0.20  9 
# 4 10  P3 15 94  9.44  0.02  9 
# 5 2  P4 11 94 619.26  0.00  9 

Однако:

dim(aa) 
# [1] 5 1 

Если я могу разделить aa на столбцы, то я думаю, что у меня будет то, что я хочу, без необходимости писать, а затем читать my.data.

Я нашел сообщение: Extracting Data from Text Files Однако в опубликованном ответе в таблице, как представляется, имеется фиксированное количество строк. В моем случае количество строк может варьироваться от 1 до 20. Кроме того, я бы предпочел использовать base R. В моем случае я думаю, что количество строк между bottom и последней строкой таблицы является константой (здесь 4).

Я также нашел сообщение: How to extract data from a text file using R or PowerShell? Однако в моем случае ширина столбцов не фиксирована, и я не знаю, как разделить строки (или строки), так что всего семь столбцов.

Учитывая все вышеизложенное, возможно, мой вопрос заключается в том, как разделить объект aa на столбцы. Благодарим вас за любые советы или помощь.

EDIT:

Фактические журналы производятся суперкомпьютер и содержать до 90000 строк. Тем не менее, количество строк значительно варьируется среди журналов. Вот почему я использовал top и bottom.

+1

Ваших данные выглядят консольный вывод из R сессии. Интересно, почему таблица не была экспортирована или почему вы не можете запустить код R, чтобы ее получить. – Roland

+0

Файл R запускается на суперкомпьютере, и таблица берется из журнала, возвращаемого этим аппаратом. Я не знаю, как попросить суперкомпьютер экспортировать таблицу для меня. –

ответ

3

Может быть ваш реальный файл журнала полностью отличается и более сложной, но с этим, вы можете использовать read.table напрямую, вы просто должны играть с нужными параметрами.

data <- read.table("c:/users/mmiller21/simple R programs/dummy.log", 
        comment.char = ">", 
        nrows = 4, 
        skip = 1, 
        header = TRUE, 
        row.names = 1) 

str(data) 
## 'data.frame': 4 obs. of 6 variables: 
## $ model : Factor w/ 4 levels "P1","P2","P3",..: 1 2 3 4 
## $ npar  : int 19 21 15 11 
## $ AICc  : int 94 94 94 94 
## $ DeltaAICc: num 0 2.64 9.44 619.26 
## $ weight : num 0.78 0.2 0.02 0 
## $ Deviance : int 9 9 9 9 

data 
## model npar AICc DeltaAICc weight Deviance 
## 13 P1 19 94  0.00 0.78  9 
## 12 P2 21 94  2.64 0.20  9 
## 10 P3 15 94  9.44 0.02  9 
## 2  P4 11 94 619.26 0.00  9 
+0

Спасибо. Я должен был упомянуть, что файл журнала содержит приблизительно 20 000 строк, поэтому я использовал верх и низ. Однако ваш ответ может помочь. –

3

read.table и его семья теперь имеет возможность читать текст:

> df <- read.table(text = paste(my.data, collapse = "\n")) 
> df 
    model npar AICc DeltaAICc weight Deviance 
13 P1 19 94  0.00 0.78  9 
12 P2 21 94  2.64 0.20  9 
10 P3 15 94  9.44 0.02  9 
2  P4 11 94 619.26 0.00  9 
> summary(df) 
model  npar   AICc  DeltaAICc   weight   Deviance 
P1:1 Min. :11.0 Min. :94 Min. : 0.00 Min. :0.000 Min. :9 
P2:1 1st Qu.:14.0 1st Qu.:94 1st Qu.: 1.98 1st Qu.:0.015 1st Qu.:9 
P3:1 Median :17.0 Median :94 Median : 6.04 Median :0.110 Median :9 
P4:1 Mean :16.5 Mean :94 Mean :157.84 Mean :0.250 Mean :9 
     3rd Qu.:19.5 3rd Qu.:94 3rd Qu.:161.90 3rd Qu.:0.345 3rd Qu.:9 
     Max. :21.0 Max. :94 Max. :619.26 Max. :0.780 Max. :9 
+0

Спасибо. Я должен был упомянуть, что файл журнала содержит приблизительно 20 000 строк, поэтому я использовал верх и низ. Однако ваш ответ может помочь. –

1

Это выглядит странно, что вы должны прочитать консоль R. Независимо от того, что вы можете использовать тот факт, что строки в вашей таблице начинаются с числового значения и извлекают вашу строку итерации, используя что-то вроде ^[0-9]+. Затем read.table, как показано в @kohske, делают все остальное.

readLines('c:/users/mmiller21/simple R programs/dummy.log') 
idx <- which(grepl('^[0-9]+',ll)) 
idx <- c(min(idx)-1,idx) ## header line 
read.table(text=ll[idx]) 
model npar AICc DeltaAICc weight Deviance 
13 P1 19 94  0.00 0.78  9 
12 P2 21 94  2.64 0.20  9 
10 P3 15 94  9.44 0.02  9 
2  P4 11 94 619.26 0.00  9 
+0

Спасибо. Я должен был упомянуть, что файл журнала содержит приблизительно 20 000 строк, поэтому я использовал верх и низ. Однако ваш ответ может помочь. –

0

Спасибо тем, кто разместил ответы. Из-за размера, сложности и изменчивости фактических файлов журналов, я думаю, мне нужно продолжать использовать переменные top и bottom. Тем не менее, я использовал элементы ответа дикоа, чтобы придумать следующее.

my.data <- readLines('c:/users/mmiller21/simple R programs/dummy.log') 

top <- '> collect.models\\(, adjust = FALSE)' 
bottom <- '> # the three lines below count the number of errors in the code above' 

my.data <- my.data[-c(grep(bottom, my.data):length(my.data))] 
my.data <- my.data[-c(1:grep(top, my.data))] 

x <- read.table(text=my.data, comment.char = ">") 
x 

# model npar AICc DeltaAICc weight Deviance 
# 13 P1 19 94  0.00 0.78  9 
# 12 P2 21 94  2.64 0.20  9 
# 10 P3 15 94  9.44 0.02  9 
# 2  P4 11 94 619.26 0.00  9 

Вот еще проще код:

my.data <- readLines('c:/users/mmiller21/simple R programs/dummy.log') 

top <- '> collect.models\\(, adjust = FALSE)' 
bottom <- '> # the three lines below count the number of errors in the code above' 

my.data <- my.data[grep(top, my.data):grep(bottom, my.data)] 

x <- read.table(text=my.data, comment.char = ">") 
x 
Смежные вопросы