如何将文件导入mathematica并按标题名称引用列

时间:2010-03-11 04:43:13

标签: wolfram-mathematica

我有一个包含许多列的TSV文件,如此;

genename    X1  X100    X103    X105    X115    X117    X120    X122    X123         
Gene20728   0.415049    0.517868    0.820183    0.578081    0.30997 0.395181

我想将其导入Mathematica,然后提取并排序列。

即,我想提取列[“X117”]并对其进行排序,然后输出排序列表。

4 个答案:

答案 0 :(得分:4)

table = Import["file.csv", "Table"];
x117 = Drop[table[[All, 7]], 1];
sorted = Sort[x117];

答案 1 :(得分:4)

我认为没有一种内置的方法来实现您似乎要求的智能结构。 以下是我认为各种可能的方法中最直接的实现。

stringdata = "h1\th2\n1\t2\n3\t4\n5"

h1  h2
1   2
5   4
3

Clear[ImportColumnsByName];
ImportColumnsByName[filename_] := 
 Module[{data, headings, columns, struc},
  data = ImportString[filename, "TSV"];
  headings = data[[1]];
  columns = Transpose[PadRight[data[[2 ;; -1]]]];
  MapThread[(struc[#1] = #2) &, {headings, columns}];
  struc
  ]

Clear[test];
test = ImportColumnsByName[stringdata];
test["h1"]
test["h2"]
Sort[test["h1"]]

输出:

{1, 3, 5}
{2, 4, 0}
{1, 3, 5}

在ragfield的解决方案的基础上,这是一个更动态的方法,但是对这个结构的每次调用都会调用Position和Part。

Clear[ImportColumnsByName];
ImportColumnsByName[filename_] := Module[{data, temp},
  data = PadRight@ImportString[filename, "Table"];
  temp[heading_] := 
   Rest[data[[All, Position[data[[1]], heading][[1, 1]]]]];
  temp
  ]

Clear[test];
test = ImportColumnsByName[stringdata];
test["h1"]
test["h2"]
Sort[test["h1"]]

输出:

{1, 3, 5}
{2, 4, 0}
{1, 3, 5}

答案 2 :(得分:1)

从ragfield的代码开始:

table = Import["file.csv", "Table"];
colname = "X117"
x117 = Drop[table[[All, Position[tb[[1, All]], colname]//Flatten]],
            1]//Flatten;
sorted = Sort[x117];

答案 3 :(得分:0)

为了处理来自不同网站的Excel文件,我对此进行了修改:

data = {{"h1", "h2"}, {1, 2}, {3, 4}, {5, ""}};

find[x_String] := Cases[Transpose[data], {x, __}]

In[]=find["h1"]

Out[]={{"h1", 1, 3, 5}}

如果它是粗糙的数据,你通常可以很容易地填充它,使其适合移调。另外我的一些来源是懒惰的格式,有时标题更改大小写,有时标题前面有一个空行,依此类推:

find2[x_String,data_List] := 
 Cases[Transpose[data], {___, 
   y_String /; 
    StringMatchQ[StringTrim[y], x, IgnoreCase -> True], __}]

In[]=find2["H1",data]
Out[]={{"h1", 1, 3, 5}}

data2 = {{"", ""}, {"H1 ", "h2"}, {1, 2}, {3, 4}, {5, ""}};

In[]=find2["h1",data2]
Out[]={{,"H1 ", 1, 3, 5}}