Wolfram mathematica 如何将文件导入mathematica并按标题名称引用列

Wolfram mathematica 如何将文件导入mathematica并按标题名称引用列,wolfram-mathematica,Wolfram Mathematica,我有一个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,然后提取并排序一列 i、 例如,我想提取列[“X117”]并对其进行排序,然后输出排序后的列表。

我有一个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,然后提取并排序一列


i、 例如,我想提取列[“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"]]
产出:

{1, 3, 5}
{2, 4, 0}
{1, 3, 5}
{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}
{1, 3, 5}
{2, 4, 0}
{1, 3, 5}

从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}}

嗨,我不知道导入时x117的列索引是什么。那么我必须读入header/colnames第一行并动态地从colname转换到index吗?我忘了提到,ImportString需要被Import替换以对文件进行操作。您可以使用
Flatten[data,{2}]
来“转置”不规则数组。此外,我认为您的
查找范围2
相当广泛,搜索范围相当危险;如果有可能在标题上方出现一个空字符串,为什么不明确地允许呢?我只是给出了一个一般性的答案,但在这样做的时候,我考虑了一些我经常导入的内容。我使用的一个数据源几乎每个版本都有不同的格式。我指的是页眉的空白填充和顶部的一行或多行空白。然而,标题——不管它如何拼写和填充——总是列中的第一个也是唯一一个字符串。谢谢你给我的关于列表不完整的建议。我不知道。为什么不改变你的模式来解释顶部的空行,而不是其他内容的任意行呢。例如:
{”“…,y_String/;StringMatchQ[StringTrim[y],x,IgnoreCase->True],{/code>在我看来,在列中查找与特定标题匹配的任何行都太宽了。(我想对这个答案投赞成票,但我担心它可能会给某人带来很多麻烦。)我能告诉你什么。我的建议是一个程式化的答案。我发布的代码片段不是我使用的,因为我知道更多关于我经常导入的数据的信息。有关人员要导入的数据性质的更多信息将导致导入该数据的更具体代码。但这些只是广义的建议,从定义上讲是广义的。