2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 13:35 
Главное - надёжнее. Меньше шанс ошибку сделать.

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 13:46 
Alm99 в сообщении #1540739 писал(а):
Ну смотрите, предположим, есть вот такой файл:

https://drive.google.com/file/d/1PiU75a ... sp=sharing

В принципе, его можно считать и на R без предварительной обработки:
Код:
get.tables <- function(lines) { # возвращает список из объектов класса data.frame
   # таблицы начинаются словом "Item"
   start_tbl <- grep('^ +Item', lines)
   # и заканчиваются перед словом "Predicted"
   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
   # вырезать 2 интересующих части и привести к матрице
   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
      )))
   )))

lines <- readLines('1_HSO4-1_H2SO4-1_DMA-1_HNO3--d_02088_d_SEEDER-1FB2X6F7Q-CBS.out')
get.tables(lines)
get.done(lines)

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

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 14:28 
Аватара пользователя
Alm99 в сообщении #1540727 писал(а):
И еще такой вопрос, если мне потребуется для каждого из параметров выбирать еще и номер шага в поле step number, мне же достаточно будет просто выполнить те же самые команды индексации:
Да, можно так, хотя второе условие лишнее, достаточно одного сравнения
Код:
idx_stepn <- which(data$V1 == "Step") .


Причина, по которой я использовал комбинацию
Код:
which(data[math]$V1 == "Max" & data$[/math]V2 == "F" )
-- это потому, что если я использую только одно
Код:
which(data$V1 == "Max" )
то получу номера строк не только c Мах F но и c Мах D, так как D и F оказались в другом столбце V2 (аналогично и для RMS). То есть получу пересортицу.

В случае же с количеством шагов (Step No) вам не нужно проверять есть ли во втором столбце слово "number". Во всяком случае, я каких-либо других слов после Step в Вашем файле не встречал.

Alm99 в сообщении #1540727 писал(а):
И как в R определять длину массива или вектора

> vec <- c(1,2,7,9,16)
> vec
[1] 1 2 7 9 16
> length(vec)
[1] 5


> vec_char <- c("Alm99","Dan","zykov","dxdy")
> vec_char
[1] "Alm99" "Dan" "zykov" "dxdy"
> length(vec_char)
[1] 4


Для матриц используйте dim()

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 16:12 
Аватара пользователя
Alm99 в сообщении #1540739 писал(а):
zykov
Ну смотрите, предположим, есть вот такой файл:

https://drive.google.com/file/d/1PiU75a ... sp=sharing


Кстати, такой файл проще парсится перлом, чем собранное в нерегулярную таблицу. Вот попробуйте такой скрипт, который сразу разделяет таб-ом поля и посмотрите результат в Екселе. Всё ли он делает правильно?

Код:
#!/usr/bin/perl
use strict;
use warnings;

my $Step = "Step number";
my $Max_Force = "Maximum Force";
my $Max_Disp = "Maximum Displacement";
my $RMS_Force = "RMS     Force";
my $RMS_Disp = "RMS     Displacement";
my $Thresh = "Threshold";
my $SCF = "SCF Done";
my @list;
my @all_nums;


my $filename = '1_HSO4-1_H2SO4-1_DMA-1_HNO3--d_02088_d_SEEDER-1FB2X6F7Q-CBS.out';

open(FH, '<', $filename) or die $!;

while(<FH>){

    if(index($_, $Step) != -1)
    {     
        @list = split(/\s+/, $_);
        print "Step number\t$list[3]\t$list[5]\t$list[9]\n";
    }   

    if(index($_, $Thresh) != -1)
    {
        @list = split(/\s+/, $_);
        print "$list[1]\t$list[2]\t$list[3]\t$list[4]\n";
    }

    if(index($_, $Max_Force) != -1)
    {
        @list = split(/\s+/, $_);
        print "$Max_Force\t$list[3]\t$list[4]\t$list[5]\n";
    }

    if(index($_, $Max_Disp) != -1) 
    {
        @list = split(/\s+/, $_);
        print "$Max_Disp\t$list[3]\t$list[4]\t$list[5]\n";
    }
       
    if(index($_, $RMS_Force) != -1)
    {
        @list = split(/\s+/, $_);
        print "$RMS_Force\t$list[3]\t$list[4]\t$list[5]\n";
    }

    if(index($_, $RMS_Disp) != -1)
    {
        @list = split(/\s+/, $_);
        print "$RMS_Disp\t$list[3]\t$list[4]\t$list[5]\n";
    }
   
    if(index($_, $SCF) != -1)
    {
        my @all_nums    = $_ =~ /(\d+)/g;
        print "E = \t-$all_nums[2].$all_nums[3]\nTotal cycles\t$all_nums[4]\n";
    }

}


close(FH);


Если нужно использовать другой файл, отредактируйте строку my $filename = '1_HSO4-1_H2SO4-1_DMA-1_HNO3--d_02088_d_SEEDER-1FB2X6F7Q-CBS.out';

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 16:37 
Или если читаете только один файл, то читайте STDIN.

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 17:32 
Dan B-Yallay
А в каком формате он выводит ( в какой файл), просто я скрипт то запустил, а выходного файла не вижу?

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 17:56 
Аватара пользователя
Alm99 в сообщении #1540781 писал(а):
А в каком формате он выводит ( в какой файл), просто я скрипт то запустил, а выходного файла не вижу?
Он выводит на экран. Чтобы результат отправить в файл надо
perl sript.pl > result.txt

где "script.pl"-- это имя, с которым Вы сохранили предложенный мною выше скрипт.

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 17:58 
Он же в стандартный выходной поток печатает. В консоли не видите результат?
Это можно в файл перенаравить ">file.txt".

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 18:10 
Dan B-Yallay
Ну в экселе он так отображает
Изображение

-- 27.11.2021, 18:10 --

zykov
Да, видел в консоли, тупанул...

-- 27.11.2021, 18:18 --

aitap
Т.е. он каждый шаг выводит в виде матрицы, а получается извлекать результат и записывать в другие массивы также проверкой построчно, как и предлагает Dan B-Yallay? Это же тип данных list

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 18:29 
Аватара пользователя
Alm99 в сообщении #1540796 писал(а):
Ну в экселе он так отображает

При открытии файла Екселем укажите разделителем только Tab:
Dan B-Yallay в сообщении #1540772 писал(а):
Вот попробуйте такой скрипт, который сразу разделяет таб-ом поля

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 18:30 
Dan B-Yallay
И еще есть тупой вопрос, не знаю как в perl, но по идее, если передать несколько имен в my $filename то вернет мне только последнее, или же просто несколько раз можно будет вызвать...

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 18:38 
Аватара пользователя
Alm99 в сообщении #1540800 писал(а):
если передать несколько имен в my $filename то вернет мне только последнее, или же просто несколько раз можно будет вызвать...
по-моему лучше будет задействовать цикл. Можно организовать это дело внутри перлового, но тогда надо будет привлекать дополнительные библиотеки по прочёсыванию локальной папки на предмет составления перечня имеющихся файлов. Либо писать скрипт на баше, в котором работа c директориями и файлами намного более интуитивна.

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 18:41 
Alm99 в сообщении #1540796 писал(а):
Т.е. он каждый шаг выводит в виде матрицы, а получается извлекать результат и записывать в другие массивы также проверкой построчно, как и предлагает Dan B-Yallay? Это же тип данных list

Не совсем понимаю, что именно Вы хотите сделать? Данные уже извлечены из файла и записаны в массивы, с которыми можно работать на R: tables <- get.tables(readLines(filename)); print(tables[[42]]); Если Вы хотите записать их снова в текстовый файл, да, это можно сделать при помощи цикла по всем элементам матрицы и списка, но потом этот файл придётся обратно разбирать. Ещё есть save()/saveRDS, который сохраняет бинарные файлы с произвольными структурами данных внутри, их можно прочитать при помощи load()/readRDS.

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 18:46 
Аватара пользователя
aitap в сообщении #1540805 писал(а):
Не совсем понимаю, что именно Вы хотите сделать?
В стартовом сообщении прикреплена картинка. Hужно из каждой мини-таблицы извлечь красные данные отдельно, синие отдельно и т.д. чтобы потом работать с ними.

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 18:52 
aitap

Dan B-Yallay
Да, все верно, не успел раньше написать)

 
 
 [ Сообщений: 59 ]  На страницу Пред.  1, 2, 3, 4  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group