这是数据文件:
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中这样做。
答案 0 :(得分:10)
您可以改为使用Import
格式的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}}
,甚至可以忽略标题行:
{{1}}
答案 1 :(得分:6)
你问过3个问题,我会尽力回答这些问题。如belisarius pointed out,Mathematica区分大小写。所以,你的代码应该是:
In[1]:=ReadList["testA.txt", Number, RecordLists -> True]
但是,由于您的第一行由String
而非Number
组成,因此仍会产生错误。因此,最简单的方法是使用Michael Pilat's solution并使用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}}
答案 2 :(得分:4)
T rue :))
Mathematica是 C ase- S 确定