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

ラグフィールドのコードから始めます:

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 に答える