4

大きな複数列のデータ ファイルがありますが、この質問については次のように簡略化できます。

data = {{"a", 2000}, {"a", 2010}, {"b", 1999}, {"b", 2004}, {"b", 
2006}, {"c", 2012}, {"c", 2014}};

次に、データから年の値を抽出するアイテムのリストがあります。たとえば、次のようになります。

selectedList = {"b", "c"};

Select[] を使用してから、selectedList を反復処理することでそれを行うことができます。

Table[
        Select[data, #[[1]] == selectedList[[i]] &][[All, 2]],

       {i, 1, Length[selectedList]}  ]

ただし、テーブルよりも高速なマップを使用したいと考えています。私がすることができます:

func[dat_, x_] := Select[dat, #[[1]] == x &][[All, 2]]

その後 :

func[data, #] & /@ selectedList

これをワンステップで行うためのよりエレガントな方法を探しています。できれば Select を selectedList に直接マッピングします

4

5 に答える 5

6
Cases[data, {#, x_} :> x] & /@ selectedList
于 2012-04-30T11:17:43.087 に答える
3

Map と Cases を使用します。

data = {{"a", 2000}, {"a", 2010}, {"b", 1999}, {"b", 2004},
   {"b", 2006}, {"c", 2012}, {"c", 2014}};
selectedList = {"b", "c"};

Map[Part[Cases[data, {#, _}], All, 2] &, selectedList]

{{1999年、2004年、2006年}、{2012年、2014年}}

ただし、本当に Select を使用したい場合は、次のように実行できます。関数は、無名スロットの混乱を避けるために使用されます。説明するために、関数を徐々に構築しました:-

Select[data, First[#] == "b" &] (* Basic start *)

{{"b", 1999}, {"b", 2004}, {"b", 2006}}

Select[data, Function[x, First[x] == "b"]] (* Implement with Function *)

{{"b", 1999}, {"b", 2004}, {"b", 2006}}

Part[Select[data, Function[x, First[x] == "b"]], All, 2]

{1999年、2004年、2006年}

Map[Part[Select[data,
    Function[x, First[x] == #]], All, 2] &, selectedList]

{{1999年、2004年、2006年}、{2012年、2014年}}

于 2012-04-30T08:52:13.293 に答える
3

別の方法は次を使用していPositionます:

Map[Function[x, data[[Position[data, x][[All, 1]], 2]]], selectedList]

(* {{1999, 2004, 2006}, {2012, 2014}} *)
于 2012-04-30T09:23:35.957 に答える
2

バリエーションとして、選択に基づく別のバリエーションを次に示します。

Last[#\[Transpose]] & /@ (Select[data, Function[x, First[x] == #1]] & ) 
/@ selectedList
于 2012-04-30T11:08:55.307 に答える
1

私は使うだろう:

Reap[Sow[#2, #] & @@@ data, selectedList][[2, All, 1]]
{{1999, 2004, 2006}, {2012, 2014}}

これは、10 列目など、他の構造に簡単に適用できます。 Sow[#10, #]

大規模なデータ セットで long を使用すると、選択要素ごとにデータが再スキャンされないため、selectedListこれよりも高速になります。Cases

例:

data = {RandomChoice[CharacterRange["a", "z"], 50000], 
        RandomInteger[100000, 50000]}\[Transpose];

selectedList = RandomSample @ CharacterRange["a", "z"];

Reap[Sow[#2, #] & @@@ data, selectedList][[2, All, 1]]; //AbsoluteTiming

Cases[data, {#, x_} :> x] & /@ selectedList;            //AbsoluteTiming
{0.0210012, Null}

{0.1010057, Null}
于 2012-05-01T23:08:30.630 に答える