2010-03-11 89 views
4

我有一个TSV文件,其中包含许多列;如何将文件导入到mathematica并通过标题名称引用列

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
table = Import["file.csv", "Table"]; 
x117 = Drop[table[[All, 7]], 1]; 
sorted = Sort[x117]; 
+0

嗨,我不知道X117列索引将是什么关于进口。那么,我必须在头文件/ colnames的第一行中读取并从colname转换为索引吗? – Tom 2010-03-11 13:34:27

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"]] 

输出:对ragfield的解决方案

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

大厦,这是一个更加动态的方法,但是这种结构每次调用进行调用定位和部分。

Clear[ImportColumnsByName]; 
ImportColumnsByName[filename_] := Module[{data, temp}, 
    data = [email protected][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} 
+0

我忘了提及,ImportString需要被Import导入来替换文件。 – Davorak 2010-03-12 01:52:17

1

从ragfield的代码开始:

table = Import["file.csv", "Table"]; 
colname = "X117" 
x117 = Drop[table[[All, Position[tb[[1, All]], colname]//Flatten]], 
      1]//Flatten; 
sorted = Sort[x117]; 
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}} 
+0

您可以使用'拼合[数据,{2}]'来“转置”一个不整齐的数组。另外,我认为你的find2在搜索中相当危险,如果头部上方有单个空字符串的可能性,为什么不明确允许? – 2011-12-15 09:10:49

+0

我只是给出了一个普遍的答案,但在这样做时考虑了我经常导入的一些东西。我使用的一个数据源几乎每个版本都有不同的格式。我的意思是指标题的空白填充以及顶部的一个或多个空白行。然而,标题 - 不管它是拼写还是填充 - 始终是列中第一个也是唯一的字符串。感谢与拼合列表的提示。我不知道。 – 2011-12-15 22:48:25

+0

为什么不改变你的模式来考虑顶部的空行,而不是其他内容的任意行。例如:'{“”...,y_String /; StringMatchQ [StringTrim [y],x,IgnoreCase - > True],__}'在我看来,找到匹配特定头的列中的任何*行太宽泛。 (我想为这个答案投票,但是我担心写文章可能会导致很多麻烦)。 – 2011-12-15 22:55:40

相关问题