4

我有一个 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

4 回答 4

4
table = Import["file.csv", "Table"];
x117 = Drop[table[[All, 7]], 1];
sorted = Sort[x117];
于 2010-03-11T08:13:37.367 回答
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}
于 2010-03-11T09:05:55.110 回答
1

从 ragfield 的代码开始:

table = Import["file.csv", "Table"];
colname = "X117"
x117 = Drop[table[[All, Position[tb[[1, All]], colname]//Flatten]],
            1]//Flatten;
sorted = Sort[x117];
于 2010-03-11T15:33:56.510 回答
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}}
于 2011-12-15T05:42:44.213 回答