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}