2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 18:57 


09/05/16
138
Alm99, а, разделить на красные и синие?

sapply(
# для каждого data.frame в списке...
get.tables(readLines('1_HSO4-1_H2SO4-1_DMA-1_HNO3--d_02088_d_SEEDER-1FB2X6F7Q-CBS.out')),
# ...выделить строку, соответствующую условиям, и из неё - столбец Value
function(x) subset(x, row.names == 'Maximum' & Item == 'Force')$Value # подставьте другие поля вместо 'Maximum' и 'Force'
)

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 19:16 


17/03/20
183
aitap
ну да, сделать так, чтобы для каждого из параметров он извлекал численное значение

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение29.11.2021, 11:26 


17/03/20
183
Dan B-Yallay
aitap
zykov


Спасибо Всем за помощь! Очень сильно помогли! Думаю, раз уж так, то надо сесть осваивать Perl также!

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение29.11.2021, 23:10 


17/03/20
183
aitap

А подскажите пожалуйста, как например в R прочитать много файлов, используя readLines? К примеру, у меня 25 файлов с именем id.out, и мне надо прочитать 15 таких файлов, в имени которого номер и расширение, чтобы применить ту же конструкцию, что Вы писали ранее:
Код:
dfL1_F[i] <- sapply( get.tables(readLines('id.out')), function(x) subset(x, row.names == 'Maximum' & Item == 'Force')$Value)
dfL1_RMF[i] <- sapply( get.tables(readLines('id.out')), function(x) subset(x, row.names == 'RMS' & Item == 'Force')$Value)
dfL1_MD[i] <- sapply( get.tables(readLines('id.out')), function(x) subset(x, row.names == 'RMS' & Item == 'Displacement')$Value)
dfL1_RMD[i] <- sapply( get.tables(readLines('id.out')), function(x) subset(x, row.names == 'RMS' & Item == 'Displacement')$Value)

и:
Код:
dflines[id] <- readLines('id.out')

Просто у меня цикл for не срабатывает, он только последний файл построчно открывает. Так же работает и конструкция:
Код:
dataFiles <- lapply(Sys.glob("id*.out"), readLines(id.out))

попробавал еще такую конструкцию:
Код:
setwd("~/Documents/")
df <- list()
listout <- dir(pattern = "\/d.out")
for (k in 1:length(listout))
{
df[[k]] <- readLines(listout[k])
}
str(ldf[[1]])


Просто потребуется построить 15 линий на одном графике, а таких графиков всего 5 и хотел использовать что-то подобное потом:

Код:
opar <- par(no.readonly=TRUE)
par(mfrow=c(5,2))
par(new=TRUE)
par(las = 1)
fot (i in 1:15){
  plot(steps <-c(62:82), dfL1_F[i][диапазон выбирается],
     type= "o",pch=16, lty=1, xlab = 'Step finals', ylab = '',
   xlim <- c(40,90))
abline(h=c(0.000450), lwd=1.5, lty=2, col="black")
mtext("MAX F", col = "black", adj=-0.1, padj=+0.1, cex=0.8)
grid(nx = NULL, ny = NULL,lty = 2, col = "gray", lwd = 1)
}

fot (i in 1:15){
  plot(steps <-c(62:82), dfL1_RMF[i][диапазон выбирается],
     type= "o",pch=16, lty=1, xlab = 'Step finals', ylab = '',
   xlim <- c(40,90))
abline(h=c(0.000450), lwd=1.5, lty=2, col="black")
mtext("MAX F", col = "black", adj=-0.1, padj=+0.1, cex=0.8)
grid(nx = NULL, ny = NULL,lty = 2, col = "gray", lwd = 1)
}
.
.
.

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение30.11.2021, 00:28 


17/03/20
183
Я попробовал конструкцию

Код:
my_fl <- list.files(pattern = "\\.out$")

dflines <- list()
for (id in seq_along(my_fl)) {
    dflines[[id]] <- readLines(my_fl[id])
}


однако, не все файлы прочитаны полностью, так например, для файла 54.out, он последний было прочитано 5509 строк, несмотря на то, что в нем 17998 строк.

В любом случае, при попытке организовать операцию выборки в цикле все же не получается:
Код:
for (j in seq_along(my_fl)){
dfL1_F[[j]] <- sapply( get.tables(my_out[[j]]),
function(x) subset(x, row.names == 'Maximum' & Item == 'Force')$Value)
}

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение30.11.2021, 13:46 


17/03/20
183
Dan B-Yallay
aitap

В общем,возникает проблема с сортировкой, он не порядку записывает файлы, поэтому на месте 54, оказался 9... Попробовал разные регулярки - не помогает. Просто если это исправить, и правильно записать циклы, то можно было бы построить множество графиков на одном:

Код:
get.tables <- function(lines) {
   start_tbl <- grep('^ +Item', lines)
   end_tbl <- grep('^ +Predicted', lines)
   stopifnot(length(start_tbl) == length(end_tbl))

   lapply(seq_along(start_tbl), function(i) {
      read.table(
         text = lines[start_tbl[i]:(end_tbl[i]-1)],
         row.names = NULL, check.names = FALSE
      )
   })
}

get.done <- function(lines) # возвращает матрицу из двух столбцов, E и cycles
   t(simplify2array(Map(function(x) as.numeric(x[2:3]),
      Filter(length, regmatches(lines, regexec(
         '^ *SCF Done: *E\\([^)]*\\) *= *([\\d.-]+) *A.U. *after *(\\d+) *cycles *$',
         lines, perl = TRUE
      )))
   )))

my_fl <- list.files(pattern = ".*.out")

my_out <- list()
for (i in seq_along(my_fl)) {
    my_out[[i]] <- readLines(my_fl[i])
}


for (j in seq_along(my_fl)){
dfL1_F[[j]] <- sapply( get.tables(my_out[[j]]),
function(x) subset(x, row.names == 'Maximum' & Item == 'Force')$Value)
}

for (i in seq_along(my_fl)){
dfQ[i] <- get.done(my_out[[i]])[,2]
}

opar <- par(no.readonly=TRUE)
par(mfrow=c(5,2))
par(new=TRUE)
par(las = 1)
fot (i in 1:15){
  plot(steps <-c(62:82), dfL1_F[i][диапазон столбцов],
     type= "o",pch=16, lty=1, xlab = 'Step finals', ylab = '',
   xlim <- c(40,90))
abline(h=c(0.000450), lwd=1.5, lty=2, col="black")
mtext("MAX F", col = "black", adj=-0.1, padj=+0.1, cex=0.8)
grid(nx = NULL, ny = NULL,lty = 2, col = "gray", lwd = 1)
}

fot (i in 1:15){
  plot(steps <-c(62:82), dfQ[i][диапазон столбцов],
     type= "o",pch=16, lty=1, xlab = 'Step finals', ylab = '',
   xlim <- c(40,90))
abline(h=c(0.000450), lwd=1.5, lty=2, col="black")
mtext("MAX F", col = "black", adj=-0.1, padj=+0.1, cex=0.8)
grid(nx = NULL, ny = NULL,lty = 2, col = "gray", lwd = 1)
}
.
.
.


Почему он мне выдает при использовании циклов предупреждение, что нет элементов для записи, и как отсортировать тогда my_fl? Как это исправить?

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение30.11.2021, 14:34 


09/05/16
138
Alm99 в сообщении #1541090 писал(а):
В общем,возникает проблема с сортировкой, он не порядку записывает файлы, поэтому на месте 54, оказался 9...

Попробуйте так:

my_out <- lapply(
# взять список файлов и поименовать элементы вектора так же, как файлы
setNames(nm = list.files(pattern = ".*.out")),
# каждый из файлов считать
readLines
)


Должен получиться именованный список, в котором каждому имени файла будет соответствовать его содержимое. Дальше, если не нравится порядок файлов в списке, можно взять names(my_out), вычленить из него номера и при помощи order(...) получить перестановку, которая расположит my_out в правильном порядке с сохранением всех имён.

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение30.11.2021, 14:50 


17/03/20
183
aitap

Цитата:
Должен получиться именованный список, в котором каждому имени файла будет соответствовать его содержимое. Дальше, если не нравится порядок файлов в списке, можно взять names(my_out), вычленить из него номера и при помощи order(...) получить перестановку, которая расположит my_out в правильном порядке с сохранением всех имён.


Так я получаю просто список, а точнее содержимое каждого файла, а судя по тому, что на экране, он точно так же оставляет всю последовательность.

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение30.11.2021, 14:55 


09/05/16
138
Alm99, вызов lapply() выше должен вернуть Вам именованный список, состоящий из векторов-строк (типа character). Да, имена располагаются в произвольном порядке (в котором их вернул вызов list.files()), но мы можем их отсортировать. Покажите мне names(my_out) и скажите, что хотите с ними сделать, и я подскажу, как получить нужную перестановку.

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение30.11.2021, 15:08 


17/03/20
183
aitap

Получаю тот же результат, что и с использованием различного рода регулярок
Код:
[1] "data1.out"  "data10.out" "data11.out" "data12.out" "data13.out"
[6] "data14.out" "data15.out" "data16.out" "data17.out" "data18.out"
[11] "data19.out" "data2.out"  "data20.out" "data21.out" "data22.out"
[16] "data23.out" "data24.out" "data25.out" "data26.out" "data27.out"
[21] "data28.out" "data29.out" "data3.out"  "data30.out" "data31.out"
[26] "data32.out" "data33.out" "data34.out" "data35.out" "data36.out"
[31] "data37.out" "data38.out" "data39.out" "data4.out"  "data40.out"
[36] "data41.out" "data42.out" "data43.out" "data44.out" "data45.out"
[41] "data46.out" "data47.out" "data48.out" "data49.out" "data5.out"
[46] "data50.out" "data51.out" "data52.out" "data53.out" "data54.out"
[51] "data6.out"  "data7.out"  "data8.out"  "data9.out"

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение30.11.2021, 15:14 
Заслуженный участник
Аватара пользователя


11/12/05
10057
Вероятно gtools поможет:

> install.packages('gtools')
[...]
> require('gtools')
Loading required package: gtools
> n
[1] "abc21" "abc2" "abc1" "abc01" "abc4" "abc201" "1b" "1a"
> mixedsort(n)
[1] "1a" "1b" "abc1" "abc01" "abc2" "abc4" "abc21" "abc201"

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение30.11.2021, 15:16 


09/05/16
138
Alm99 в сообщении #1541109 писал(а):
Получаю тот же результат, что и с использованием различного рода регулярок

Это нормально, потому что регулярки не влияют на сортировку результата. Кроме того, сортировка всё равно не гарантирована для большинства функций, возвращающих списки файлов.

Если предположить, что Вам нужно расположить имена файлов по возрастанию номера, вот обещанная перестановка:

p <- order(as.numeric(regmatches(names(my_out), regexpr('\\d+', names(my_out), perl=TRUE))))

Исправлено: x -> names(my_out)

Здесь снова используется регулярное выражение, чтобы вытащить из имён файлов их номера, после чего as.numeric превращает их в числа, а order, собственно, возвращает перестановку, которая отсортирует names(my_out) по возрастанию этих номеров. Теперь my_out[p] будет отсортирован в нужном порядке.

На будущее -- я забыл об этом сказать -- удобный способ поделиться данными - это функция dput(). Она напечатает данные в таком виде, в котором их легче всего скопировать к себе в сессию R.

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение30.11.2021, 15:19 


17/03/20
183
Dan B-Yallay
пробовал, не помогло(

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение30.11.2021, 15:21 
Заслуженный участник
Аватара пользователя


11/12/05
10057
Тогда попробуйте еще stringr

library(stringr)

str_sort(n, numeric = TRUE)

[1] "1a" "1b" "abc1" "abc01" "abc2" "abc4" "abc21" "abc201"


-- Вт ноя 30, 2021 06:22:02 --

Или то, что предложил aitap

 Профиль  
                  
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение30.11.2021, 15:40 


17/03/20
183
aitap
Может я что-то делаю не так, однако результат тот же...

Dan B-Yallay
он сортирует my_fl, однако к my_out он ее не применяет

-- 30.11.2021, 15:56 --

Dan B-Yallay
Да, помогло!

aitap
Однако, я не понимаю, вот книга, прям перед глазами, почему циклы то не работают, чтобы правильно записать требуюемую информацию в i-ый лист...

Код:
for (j in seq_along(my_fl_s)){
dfL1_F <- sapply( get.tables(my_out[[j]]),
function(x) subset(x, row.names == 'Maximum' & Item == 'Force')$Value)
}


Он получается возвращает только последние значения, и при этом, файлов 54, а возвращает только 34 значения... Как так сделать, чтобы он записал в dfL1_F записать листы, каждый из которых будет содержать все значения о конкретном параметре?

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

Просто набивать 54 plot для пяти параметров, это 250 строк кода, да и вероятность сбиться близится к 1

-- 30.11.2021, 16:11 --

aitap, Dan B-Yallay

Прошу прощения, разобрался, почему такая ошибка возникла, остается только одна проблема, поскольку в каждом случае, размерность разная, как вывести эти 54 графика на одном, т.е. определять размерность и каждый раз передавать ее в диапазон шагов, чтобы он строил их на одной фигуре:

Код:
fot (i in 1:54)
plot(steps <-c(1:length(dfL1_F[[i]])), dfL1_F[[i]],
     type= "o",pch=16, lty=1, xlab = 'Step finals', ylab = '')


 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 59 ]  На страницу Пред.  1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group