2014 dxdy logo

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

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




На страницу 1, 2, 3, 4  След.
 
 Извлечение данных из файла и визуализация в R
Сообщение26.11.2021, 13:15 
Добрй день, уважаемые форумчане! Подскажите пожалуйста, есть вопрос, не нашел на него ответ ни в литература (знакомство с языком 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 
Аватара пользователя
Alm99 в сообщении #1540624 писал(а):
Имеется текстовый файл,
В Вашем файле есть некое безобразие которое сбивает всю структуру таблицы:
Вложение:
data.jpg


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


У вас нет доступа для просмотра вложений в этом сообщении.

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

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

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

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение26.11.2021, 19:01 
Аватара пользователя
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 
Dan B-Yallay
Буду очеь признателен Вам за помощь! Можно было попробовать на awk и sed извлечь эти данные, но я и так переписал уже две программы, чтобы из неупорядоченного текста получить хотя бы такую таблицу... То что она не прямоугольная, да, это осложянет ситуацию!

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение26.11.2021, 19:13 
Аватара пользователя
Kстати, у Вас там в данных еще где-то сбой идёт. См:
Вложение:
Data2.jpg

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

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

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

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


У вас нет доступа для просмотра вложений в этом сообщении.

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение26.11.2021, 19:22 
Dan B-Yallay в сообщении #1540671 писал(а):
Kстати, у Вас там в данных еще где-то сбой идёт. См:
Вложение:
Data2.jpg

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



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

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 02:38 
Аватара пользователя
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

, индексируем те строчки, в которых есть нужные нам параметры.
Код:
> 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 
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 
Alm99 в сообщении #1540727 писал(а):
а из выходных файлов приходилось тащить данные с помощью grep, sed.
Проще написать perl-скрипт, чтобы парсил текст и выдавал нужные таблицы.
Я так в своё время делал - парсил текстовые логи и потом таблицы в Matlab загонял.

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 11:54 
zykov
не владею perl, да и awk, sed только осваиваю, там 1000 файлов, и более 100 скриптов, чтобы выводить данные хотя бы в виде .csv файла, который хоть читабелен, ибо в самой программе все перекошено, а необходиые данные запиханы среди кучи таблиц ненужных промежуточных расчетов

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 12:19 
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 
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 
Alm99 в сообщении #1540739 писал(а):
Не совсем понял
Строка
Используется синтаксис Perl
while($str=<STDIN>)
это начало цикла 'while', читает в переменную 'str' за раз одну строку из стандартного входного потока.
Далее, в теле цикла можно понаписать сколько угодно 'if/else/case' для обработки этой строки. Из разных строк можно разные данные извлекать.
IMHO, будет грамотнее, чем длинные shell-скрипты писать с 'egrep' и 'sed'.

 
 
 
 Re: Извлечение данных из файла и визуализация в R
Сообщение27.11.2021, 13:33 
zykov
Скорее всего и грамотно, и быстрее, тут я как бы не спорю)

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


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