2014 dxdy logo

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

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




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


17/03/20
183
Добрй день, уважаемые форумчане! Подскажите пожалуйста, есть вопрос, не нашел на него ответ ни в литература (знакомство с языком R по книге R in Action Data analysis and graphics withR ROBERT I. KABACOFF , и еще поискал на различных форумах, а вопрос заключается в следующем:

Имеется текстовый файл, в котором записаны данные расчетов методом Хартри-Фока. Мне необходимо построить графики следующего типа: число шагов (записаны в step of number) для каждого из четырех параметров (отмечены цветом): т.е. сначала строится график для одного параметра последние 20 шагов (т.е. 20 блоков как на картинке), затем для другого и так далее. И вопрос в том, как в R выделить эти данные из каждого блока записи и уже потом записать их в массив...

К примеру: если есть данные такого типа:

Код:
    patientID     age     diabetes     status
1         1       25        Type1       Poor
2         2       34        Type2    Improved
3         3       28        Type1    Excellent
4         4       52        Type1       Poor


то извлечь данные достаточно просто:
Используется синтаксис Rails
patientdata[1:2]

Используется синтаксис Rails
patientdata[c(“diabetes”, “status”)]


Вопрос в том, как в R извлекать данные из такой таблицы, полный текстовый файл доступен по ссылке, его структура (фрагмен на фото)
Изображение


Может даже и на Python легче это сделать, но мне показалось, что в R визуализация будет проще, поэтому решил в нем попытаться попробовать.

https://drive.google.com/file/d/1Xy1coZyN9GgGhfzXeUEMOEIzHLrhgug6/view?usp=sharing

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


11/12/05
10062
Alm99 в сообщении #1540624 писал(а):
Имеется текстовый файл,
В Вашем файле есть некое безобразие которое сбивает всю структуру таблицы:
Вложение:
data.jpg
data.jpg [ 140.77 Кб | Просмотров: 0 ]


В выделенном столбце отсутствует "шапка" с "Е = ..." и "Total cycs" и при чтении получается каша. После того, как это будет исправлено, можно уже будет загонять таблицу в R и смотреть, что делать дальше и как выковыривать нужные данные.

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


17/03/20
183
Dan B-Yallay

Исправил файл, однако, поскольку это файл вычислительной программы Gaussian, некоторых параметров, полей не будет, это исправить практически невозможно, только если игнорировать, и писать NaN... Я прикрепил ссылку на правленный файл...

https://drive.google.com/file/d/1Xy1coZyN9GgGhfzXeUEMOEIzHLrhgug6/view?usp=sharing

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


11/12/05
10062
Alm99 в сообщении #1540654 писал(а):
Исправил файл, однако, поскольку это файл вычислительной программы Gaussian, некоторых параметров, полей не будет, это исправить практически невозможно, только если игнорировать, и писать NaN

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

Time: Sep 16 16:40
File: 2_SA-1_DMA-1_HNO3--d_071 \
16_d_SEEDER-1FEEWKHAH-rot-CBS_X
Host: node137e5


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

Я могу попробовать помочь с перлом, но это займёт время.

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


17/03/20
183
Dan B-Yallay
Буду очеь признателен Вам за помощь! Можно было попробовать на awk и sed извлечь эти данные, но я и так переписал уже две программы, чтобы из неупорядоченного текста получить хотя бы такую таблицу... То что она не прямоугольная, да, это осложянет ситуацию!

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


11/12/05
10062
Kстати, у Вас там в данных еще где-то сбой идёт. См:
Вложение:
Data2.jpg
Data2.jpg [ 126.97 Кб | Просмотров: 0 ]

Строка Мах F отсутствует. Похоже, это связано с не совсем удачным исправлением первоначальной проблемы, так как местоположение близкое.

-- Пт ноя 26, 2021 10:14:21 --

Alm99 в сообщении #1540669 писал(а):
Буду очеь признателен Вам за помощь!

Хорошо, я попробую.

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


17/03/20
183
Dan B-Yallay в сообщении #1540671 писал(а):
Kстати, у Вас там в данных еще где-то сбой идёт. См:
Вложение:
Data2.jpg

Строка Мах F отсутствует. Похоже, это связано с не совсем удачным исправлением первоначальной проблемы, так как местоположение близкое.
-- Пт ноя 26, 2021 10:14:21 --



Это проблемы самой вычслительной программы

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


11/12/05
10062
Alm99
Насколько я понял, в Вашей таблице нет специального разделителя полей: всё структурируется с помощью различного количества пробелов. Поэтому даже с перлом будет достаточно много возни. Если надо по-быстрому решить проблему и просто вычленить данные по категориям Мах F / RMS F / Мах D / RMS D, то предлагаю простой как кирпич выход: из Вашей таблицы с помощью AWK вырезaть столбцы, после чего обрабатывать, скармливать R и там окончательно уже работать с данными. Я сначала попрoбовал открыть Вашу таблицу в Екселе/Оффисе и нашел, что столбцы в таблице фиксированной ширины в 31 символ, поэтому отрезаем столбик из файла, сохраняем во временном файле tmp, затем с помощью того же AWK заменяем пробелы (в вырезанном столбце) на табы чтобы сохранить в файле с тайм-меткой, относящейся к этому столбцу:

Код:
awk '{print substr($0,1,31)}' data.txt > tmp1 && awk -v OFS="\t" '$1=$1' tmp1 > Time16-1641.txt

(Also)

Для выделения 2-го, 3-го и последующих столбцов используйте инкремент во втором параметре AWK print substr по тридцать:

awk '{print substr($0,31,31)}' data.txt > tmp2
awk '{print substr($0,61,31)}' data.txt > tmp3
awk '{print substr($0,91,31)}' data.txt > tmp4
awk '{print substr($0,121,31)}' data.txt > tmp5
...

Получаем:

Код:
E   =   -2652.20741406
Total   cycs:   18
Step   number   1   of   241
Max   F   0.003437   0.000450   NO
RMS   F   0.000715   0.000300   NO
Max   D   0.756740   0.001800   NO
RMS   D   0.166545   0.001200   NO
E   =   -2652.20628340
Total   cycs:   15
Step   number   2   of   241
Max   F   0.004916   0.000450   NO
RMS   F   0.001127   0.000300   NO
Max   D   0.569033   0.001800   NO
RMS   D   0.128685   0.001200   NO
E   =   -2652.20763785
...........


Затем импортируем полученный файл в R
Код:
> data <- read.delim2("Time16-1641.txt", header = FALSE)

Вложение:
R.jpg
R.jpg [ 43.12 Кб | Просмотров: 0 ]

, индексируем те строчки, в которых есть нужные нам параметры.
Код:
> idx_maxf <- which(data$V1 == "Max" & data$V2 == "F" )
> idx_rmsf <- which(data$V1 == "RMS" & data$V2 == "F" )
> idx_maxd <- which(data$V1 == "Max" & data$V2 == "D" )
> idx_rmsd <- which(data$V1 == "RMS" & data$V2 == "D" )


Обычно структура команды такая: idx <- which("условие") но из-за того, что нам пришлось заменить пробелы на табы, Мах и F оказались в разных столбцах, поэтому приходится использовать комбинацию условий.

После этого записываем в MaxF (RMSF/MaxD/RMSD) все значения из столбца data$V3 с индексами idx_maxf (idx_rmsf / idx_maxd / idx_rmsd)

(MaxF)

> MaxF <- data$V3[idx_maxf]
> MaxF
[1] 0.003437 0.004916 0.002526 0.003274 0.013747 0.002389 0.002595 0.005798 0.002762 0.002285 0.001634 0.001637 0.001444 0.001388 0.001751 0.002442 0.002166
[18] 0.001364 0.000796 0.001466 0.001522 0.001100 0.000493 0.000434 0.000711 0.000606 0.000270 0.000127 0.000290 0.000220 0.000095 0.000069 0.000121 0.000104
[35] 0.000051 0.000056 0.000093 0.000081 0.000041 0.000055 0.000117 0.000151 0.000123 0.000072 0.000083 0.000116 0.000102 0.000118 0.000160 0.000120 0.000243
[52] 0.000141 0.000153 0.000151 0.000182 0.000064 0.000213 0.000231 0.000145 0.002967 0.000143 0.002089 0.000152 0.000065 0.000063 0.000293 0.000861 0.000420
[69] 0.000567 0.000338 0.000985 0.000402 0.000544 0.007882 0.000144 0.000142 0.022328 0.000130 0.016594 0.000139 0.002148 0.000477 0.000147 0.000343 0.000137
[86] 0.002042 0.000149 0.013459 0.000135 0.002167 0.000418 0.000385 0.002601 0.000083 0.000139 0.004786 0.000074 0.001147 0.000510 0.000479 0.002008 0.000697
[103] 0.000456 0.025461 0.000085 0.032631 0.000082 0.000151 0.001978 0.000080 0.000212 0.005716 0.000077 0.000112 0.000195 0.004909 0.000073 0.000106 0.002455
[120] 0.000081 0.000134 0.006881 0.000079 0.000825 0.002201 0.000088 0.000196 0.000832 0.000414 0.005320 0.000059 0.000073 0.007069 0.000161 0.003449 0.000062
[137] 0.003143 0.000079 0.001583 0.000076 0.007688 0.000101 0.000326 0.002751 0.000077 0.000442 0.001408 0.000078 0.000362 0.000527 0.000448 0.061179 0.014814
[154] 0.023395 0.000086 0.029230 0.000092 0.003432 0.000534 0.001017 0.000318 0.040633 0.012013 0.017319 0.012152 0.000094 0.007348 0.000098 0.001078 0.001042
[171] 0.001169 0.000561 0.000373 0.000336 0.001234 0.000516 0.040857 0.000122 0.001229
913 Levels: -2652.20415575 -2652.20570328 -2652.20628340 -2652.20635612 -2652.20696237 -2652.20732650 -2652.20741406 -2652.20763785 ... 99

> RMSF <- data$V3[idx_rmsf]
> MaxD <- data$V3[idx_maxd]
> RMSD <- data$V3[idx_rmsd]


отсюда уже можно выбирать нужные 20 чисел
Код:
df <- MaxF[1:20]
(или, скажем, RMSD[159:179]) для графического представления и т.д.

Отмечу еще, что в Вашей первоначальной таблице данных в столбцах 4, 11, 12 отсутствуют записи Max F, а в столбцах 5 -6 -7 отсутствуют RMS D. Ну на это Вы уже ответили

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


17/03/20
183
Dan B-Yallay
Да, действительно, разделители полей отсуствуют, но ровно все тоже самое и в самом csv файле... К сожалению, исправить полноценно вывод всех параметров без пропусков просто не получится, программа без открытого исходного кода, а из выходных файлов приходилось тащить данные с помощью grep, sed.

И еще такой вопрос, если мне потребуется для каждого из параметров выбирать еще и номер шага в поле step number, мне же достаточно будет просто выполнить те же самые команды индексации:

Код:
idx_stepn <- which(data$V1 == "Step" & data$V2 == "number" )
StepN <- data$V3[idx_stepn]
df1 <- MaxF[1:20]
df2 <- StepN[1:20]
plot(df2,df1, type = "b")


И как в R определять длину массива или вектора, через len(arr), как написано в книге, или в данном случае иначе, чтобы просто понимать сколько всего элементов столбце, для выбора требуемых чисел?

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


18/09/21
1756
Alm99 в сообщении #1540727 писал(а):
а из выходных файлов приходилось тащить данные с помощью grep, sed.
Проще написать perl-скрипт, чтобы парсил текст и выдавал нужные таблицы.
Я так в своё время делал - парсил текстовые логи и потом таблицы в Matlab загонял.

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


17/03/20
183
zykov
не владею perl, да и awk, sed только осваиваю, там 1000 файлов, и более 100 скриптов, чтобы выводить данные хотя бы в виде .csv файла, который хоть читабелен, ибо в самой программе все перекошено, а необходиые данные запиханы среди кучи таблиц ненужных промежуточных расчетов

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


18/09/21
1756
Alm99 в сообщении #1540732 писал(а):
не владею perl
Там освоить не сложно, документации полно.
В плане алгоритмов - те же 'for', 'if'. Только вот ещё регулярные выражения надо освоить, но это в целом полезный навык.
Вот простой пример:
Используется синтаксис Perl
#!/usr/bin/perl
while($str=<STDIN>)
{
  if($str=~/ER=/)
  {
    $s = (split(/ER=/, $str))[1];
    print "$s";
  }
}
exit 0;
Читал со стандартного входа текст построчно, искал строки с "ER=" и выдавал в стандартный выход то что после этого "ER=".

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


17/03/20
183
zykov
Ну смотрите, предположим, есть вот такой файл:

https://drive.google.com/file/d/1PiU75a1HAnKf6waWSxPg9WKWA9UQa--V/view?usp=sharing

из него надо получать данные вот такого харктера:

Код:
        Item               Value     Threshold  Converged?
Maximum Force            0.075094     0.000450     NO
RMS     Force            0.015117     0.000300     NO
Maximum Displacement     2.626742     0.001800     NO
RMS     Displacement     0.630156     0.001200     NO


и где-то чуть ниже идут строки:
Код:
SCF Done:  E(RPW91-PW91) =  -1816.18886957     A.U. after   16 cycles


и перед каждым блоком вписывать номер шага какой это, а затем и выводить количество циклов оптимизации на каждом шаге, при этом при конвертации из csv в txt надо было разбивать мне еще
Код:
E = -1816.18886957  16 cycs


следующим образом:
Код:
E = -1816.18886957
Total cycs: 16 cycs


Для этого есть скрипт:
Код:
egrep 'Step nu|RMS.*YES|RMS.*NO|Maximum.*YES|Maximum.*NO|hours|Normal|SCF Done:|Leave|Error termination' $1 |\
sed 's/(.*)//' | sed 's/A\.U\. after //' | sed 's/Normal.*/!!!   NORMAL  TERMINATION   !!!/' |\
sed 's/Error termination.*/!!!   ERROR  TERMINATION   !!!/' |\
sed 's/SCF Done: //' | sed 's/cycles/cycs /' | sed 's/,.*//' | sed 's/Maximum/Max/' |\
sed 's/Displacement/D/' | sed 's/Force/F/' | sed 's/\**\*/AHTUNG/'
echo " "
echo  Time: `ls -l $1 | awk '{print $6" "$7" "$8}'`
echo File: $1 | sed 's/\.out//g' | sed 's/\.cut/_X/g'


А потом для каждого такого файла, записывается столюец в csv файл, который раздробил я на текстовый, дабы передо мной стояла такая задача,а теперь надо вот строить графики этих параметров, уважаемый Dan B-Yallay дал хороший очень ответ, хоят конечно, в силу плохого файла (я это сам прекрасно осознаю придется делать кучу дополнительных операций), чтобы заганть данные в R, меня вот только интересует последний еще вопрос, который я задал, про step numbers...

-- 27.11.2021, 12:54 --

zykov
Цитата:
Читал со стандартного входа текст построчно


Не совсем понял

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


18/09/21
1756
Alm99 в сообщении #1540739 писал(а):
Не совсем понял
Строка
Используется синтаксис Perl
while($str=<STDIN>)
это начало цикла 'while', читает в переменную 'str' за раз одну строку из стандартного входного потока.
Далее, в теле цикла можно понаписать сколько угодно 'if/else/case' для обработки этой строки. Из разных строк можно разные данные извлекать.
IMHO, будет грамотнее, чем длинные shell-скрипты писать с 'egrep' и 'sed'.

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


17/03/20
183
zykov
Скорее всего и грамотно, и быстрее, тут я как бы не спорю)

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

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



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

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


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

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