在Mathematica中阅读此类文件

use*_*858 1 wolfram-mathematica

这是数据文件:

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  
Run Code Online (Sandbox Code Playgroud)

我应该能够访问此文件中的每个元素,我试图在Mathematica中创建记录时使用此函数但我收到错误

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

Error: ReadList::opttf: Value of option RecordLists -> true should be True or False.
Run Code Online (Sandbox Code Playgroud)

另外,如何在完成记录后访问每个元素?

Mathematica中还有一种方法可以创建一个列,它可以在两个日期之间产生差异并将其放入新列中.

这个家庭作业允许使用excel来计算,但我必须在Mathematica中这样做.

Mic*_*lat 10

你也可以使用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}}
Run Code Online (Sandbox Code Playgroud)


rco*_*yer 6

你问了3个问题,我会尽力回答这些问题.正如belisarius指出的那样,Mathematica区分大小写.所以,你的代码应该是:

In[1]:=ReadList["testA.txt", Number, RecordLists -> True]
Run Code Online (Sandbox Code Playgroud)

但是,这仍然会产生错误,因为你的第一行是由Strings而不是Numbers组成的.因此,最简单的方法是使用Michael Pilat的解决方案并使用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}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要特定的列

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}
Run Code Online (Sandbox Code Playgroud)

现在,要在列表中添加另一列,有两种方法.最简单的方法是对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}}
Run Code Online (Sandbox Code Playgroud)

选择现在的行和Apply它们的功能,

In[5]:=Plus @@ Out[4][[{3,6}]]
Out[5]:={10,13,18}
Run Code Online (Sandbox Code Playgroud)

将新行附加到旧数据,然后转置回来

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}}
Run Code Online (Sandbox Code Playgroud)

概念上更困难但更直接的方法是使用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}}
Run Code Online (Sandbox Code Playgroud)

  • 关于添加列我最近发现了'ArrayFlatten`的乐趣:http://stackoverflow.com/questions/1244782/how-to-prepend-a-column-to-a-matrix/2274679#2274679 (2认同)