как импортировать файл в Mathematica и ссылаться на столбец по имени заголовка - PullRequest
4 голосов
/ 11 марта 2010

У меня есть файл 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 голосов
/ 11 марта 2010

Я не думаю, что есть встроенный метод достижения умной структуры, о которой вы, похоже, просите. Ниже приведена наиболее прямолинейная реализация из всех возможных методов.

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}
4 голосов
/ 11 марта 2010
table = Import["file.csv", "Table"];
x117 = Drop[table[[All, 7]], 1];
sorted = Sort[x117];
1 голос
/ 11 марта 2010

Начиная с кода ragfield:

table = Import["file.csv", "Table"];
colname = "X117"
x117 = Drop[table[[All, Position[tb[[1, All]], colname]//Flatten]],
            1]//Flatten;
sorted = Sort[x117];
0 голосов
/ 15 декабря 2011

Для обработки файлов 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}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...