Чтение этого типа файла в Mathematica - PullRequest
1 голос
/ 03 ноября 2010

Это файл данных:

ID  YR  MO  DA  YrM  MoM  DaM  
100  2010  2  20  2010  8  30  
110  2010  4  30  2010  9  12     
112  2010  8  20  2010  10  28  

Я должен иметь доступ к каждому элементу в этом файле, я пытался использовать эту функцию при создании записи в Mathematica, но получаю ошибку

ReadList["testA.txt", Number, RecordLists -> true]

Error: ReadList::opttf: Value of option RecordLists -> true should be True or False.

Также, как мне получить доступ к каждому элементу после выполнения записей?

Также в Mathematica есть способ создать еще один столбец, который различает две даты, и поместить его в новый столбец.

Это домашнее задание позволяет использовать Excel для вычисления, но я должен сделать это в Mathematica.

Ответы [ 3 ]

10 голосов
/ 03 ноября 2010

Вместо этого можно использовать Import с форматом "Table", который может даже игнорировать строки заголовка:

In[1:= Import["test.txt", "Table", "HeaderLines" -> 1]

Out[1]= {{100, 2010, 2, 20, 2010, 8, 30}, {110, 2010, 4, 30, 2010, 9,
12}, {112, 2010, 8, 20, 2010, 10, 28}}
6 голосов
/ 03 ноября 2010

Вы задали 3 вопроса, и я постараюсь ответить на них все. Как указал belisarius , Mathematica чувствительна к регистру. Итак, ваш код должен быть:

In[1]:=ReadList["testA.txt", Number, RecordLists -> True]

Однако, это все равно вызовет ошибку, поскольку ваша первая строка состоит из String s, а не Number s. Итак, самое простое, что нужно сделать, это пойти с решением Майкла Пилата и использовать Import. Это возвращает список списков, где каждая запись в файле становится одним из подсписков.

Для доступа к конкретному подсписку вы используете Part или его более простую форму [[ ]], как указано ниже:

In[2]:={{100, 2010, 2, 20, 2010, 8, 30}, 
        {110, 2010, 4, 30, 2010, 9,12}, 
        {112, 2010, 8, 20, 2010, 10, 28}}[[1]]
Out[2]:={100, 2010, 2, 20, 2010, 8, 30}

Или, если вы хотите определенный столбец

In[3]:={{100, 2010, 2, 20, 2010, 8, 30}, 
        {110, 2010, 4, 30, 2010, 9,12}, 
        {112, 2010, 8, 20, 2010, 10, 28}}[[All,4]]
Out[3]:={20, 30, 20}

Теперь, чтобы добавить еще один столбец в список, есть несколько способов. Самый простой способ - Transpose ваши данные,

In[4]:=Transpose[data]
Out[4]:={{100, 110, 112}, {2010, 2010, 2010}, {2, 4, 8}, 
         {20, 30, 20}, {2010, 2010, 2010}, {8, 9, 10}, {30, 12, 28}}

выберите текущие строки и Apply функцию для них,

In[5]:=Plus @@ Out[4][[{3,6}]]
Out[5]:={10,13,18}

присоединить новую строку к старым данным и транспонировать обратно

In[6]:=Out[4]~Join~Out[5] // Transpose
Out[6]:={100, 2010, 2, 20, 2010, 8, 30, 10}, 
        {110, 2010, 4, 30, 2010, 9, 12, 13}, 
        {112, 2010, 8, 20, 2010, 10, 28, 18}}

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

In[7]:=Map[#~Join~{Plus@@#[[{3,6}]]}&, data]
Out[7]:={100, 2010, 2, 20, 2010, 8, 30, 10}, 
        {110, 2010, 4, 30, 2010, 9, 12, 13}, 
        {112, 2010, 8, 20, 2010, 10, 28, 18}}
4 голосов
/ 03 ноября 2010

T rue :))

Mathematica является C ase- S пассивным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...