我有一個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」]並對其進行排序,並輸出排序列表。
我有一個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」]並對其進行排序,並輸出排序列表。
table = Import["file.csv", "Table"];
x117 = Drop[table[[All, 7]], 1];
sorted = Sort[x117];
我不認爲有一個內置的方法來實現你似乎要求的智能結構。 以下是我認爲是各種可能方法中最直接的實現。
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}
我忘了提及,ImportString需要被Import導入來替換文件。 – Davorak 2010-03-12 01:52:17
從ragfield的代碼開始:
table = Import["file.csv", "Table"];
colname = "X117"
x117 = Drop[table[[All, Position[tb[[1, All]], colname]//Flatten]],
1]//Flatten;
sorted = Sort[x117];
用於處理來自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}}
您可以使用'拼合[數據,{2}]'來「轉置」一個不整齊的數組。另外,我認爲你的find2在搜索中相當危險,如果頭部上方有單個空字符串的可能性,爲什麼不明確允許? – 2011-12-15 09:10:49
我只是給出了一個普遍的答案,但在這樣做時考慮了我經常導入的一些東西。我使用的一個數據源幾乎每個版本都有不同的格式。我的意思是指標題的空白填充以及頂部的一個或多個空白行。然而,標題 - 不管它是拼寫還是填充 - 始終是列中第一個也是唯一的字符串。感謝與拼合列表的提示。我不知道。 – 2011-12-15 22:48:25
爲什麼不改變你的模式來考慮頂部的空行,而不是其他內容的任意行。例如:'{「」...,y_String /; StringMatchQ [StringTrim [y],x,IgnoreCase - > True],__}'在我看來,找到匹配特定頭的列中的任何*行太寬泛。 (我想爲這個答案投票,但是我擔心寫文章可能會導致很多麻煩)。 – 2011-12-15 22:55:40
嗨,我不知道X117列索引將是什麼關於進口。那麼,我必須在頭文件/ colnames的第一行中讀取並從colname轉換爲索引嗎? – Tom 2010-03-11 13:34:27