2010-03-11 5 views
4

나는 많은 열이있는 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"]을 추출하여 정렬하고 정렬 된 목록을 출력하고 싶습니다. 나는 스마트 구조를 달성하는 방법에 내장 없다고 생각

답변

4
table = Import["file.csv", "Table"]; 
x117 = Drop[table[[All, 7]], 1]; 
sorted = Sort[x117]; 
+0

안녕, 나는 x117의 열 인덱스가 될 것입니다 모르겠어요 가져 오기. 그렇다면 첫 번째 줄의 머리글/colnames를 읽고 colname을 인덱스로 변환해야합니까? – Tom

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"]] 

출력 : 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"]] 

출력 : ragfield의 코드에서 시작

{1, 3, 5} 
{2, 4, 0} 
{1, 3, 5} 
+0

내가 언급 한 것을 잊어 버렸습니다. 가져 오기를 가져 오기로 대체해야 파일을 조작 할 수 있습니다. – Davorak

1

:에서 Excel 파일을 처리하는

table = Import["file.csv", "Table"]; 
colname = "X117" 
x117 = Drop[table[[All, Position[tb[[1, All]], colname]//Flatten]], 
      1]//Flatten; 
sorted = Sort[x117]; 
0

나는이에 변화를 할 여러 사이트 :

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}} 
+0

'Flatten [data, {2}]'를 사용하여 비정형 배열을 "조 변경"할 수 있습니다. 또한, 당신의'find2'는 검색에서 다소 위험한 것으로 생각합니다; 헤더 위에 하나의 빈 문자열이있을 가능성이있는 경우이를 명시 적으로 허용하지 않는 이유는 무엇입니까? –

+0

나는 일반화 된 대답을하고 있었지만 정기적으로 가져 오는 것들에 대해 생각하면서 그렇게했다. 내가 사용하는 하나의 데이터 소스는 각 릴리스마다 거의 다른 형식을 가지고 있습니다. 머리말의 공백 채우기 및 맨 위에있는 하나 이상의 빈 행을 의미합니다. 그러나 헤더 (철자가 있거나 채워질 수 있음)는 항상 열의 처음이자 유일한 문자열입니다. 불규칙한 목록에 대해 Flatten과 팁을 주셔서 감사합니다. 나는 그것을 몰랐다. –

+0

상단의 빈 줄은 고려하지만 다른 내용의 임의의 줄은 고려하지 말고 패턴을 변경하십시오. 예 :'{ ""..., y_String /; StringMatchQ [StringTrim [y], x, IgnoreCase -> True], __}'특정 머리와 일치하는 열의 * 행을 찾는 것이 너무 광범위하다고 생각합니다. (나는이 답변에 투표하고 싶다. 그러나 나는 서면으로 누군가에게 많은 어려움을 초래할 수 있다고 우려하고있다.) –