Wolfram mathematica 将一个列表的选择映射到第二个列表

Wolfram mathematica 将一个列表的选择映射到第二个列表,wolfram-mathematica,Wolfram Mathematica,我有一个大的多列数据文件,但对于这个问题,它可以简化如下: data = {{"a", 2000}, {"a", 2010}, {"b", 1999}, {"b", 2004}, {"b", 2006}, {"c", 2012}, {"c", 2014}}; 然后,我有一个要从数据中提取年份值的项目列表,例如: selectedList = {"b", "c"}; 我可以使用Select[],然后在selectedList中迭代: Table[ Select[data, #

我有一个大的多列数据文件,但对于这个问题,它可以简化如下:

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]}  ]
不过我想使用Map,它应该比Table快。我可以这样做:

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

func[data, #] & /@ selectedList

我正在寻找一种更优雅的方法,一步到位,最好是将Select直接映射到selectedList

我会使用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 *)
Part[Select[data, Function[x, First[x] == "b"]], All, 2]
{b,1999},{b,2004},{b,2006}

Select[data, Function[x, First[x] == "b"]] (* Implement with Function *)
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}

另一种方法是使用位置:


对于变化,这里是另一个基于选择的变化:

Last[#\[Transpose]] & /@ (Select[data, Function[x, First[x] == #1]] & ) 
/@ selectedList
我将使用:

Reap[Sow[#2, #] & @@@ data, selectedList][[2, All, 1]]
这很容易适应其他结构,例如第十列:Sow[10,]

对于大型数据集和较长的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

+1,但我通常将其包装在块[{x},…]中,以防x在其他地方定义。这确实很优雅,但我真正的数据文件来自excel,是一个多列文件,日期在第10列-这将起作用:-Cases[data,{,{,{,},{,{,},{,},{,},{,},{,},},}x}:>x]&/@selectedList可能类似于Cases[data22,{,{,{,{,},x},{,}:>x]&/{b,c}行吗?@Chris这是不必要的:x已经被RuleDelayed:>本地化了。很好,Wizard先生。我从来没有意识到这一点-只有在我的帮助下。谢谢!正是我要查找的案例或选择,但不是表格:-
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}