How to| 对数据的子群进行操作
对数据汇总时,分析数据的子群通常很有用. 例如农作物产量可以根据种子品种归类,病人平均恢复时间可以根据病人年龄或药物类型分组. Wolfram 语言令您可以基于其它列中的值对数据列进行拆分. 然后,您可以对得到的子群计算所需的统计数字.
agdata = {{clay, seedB, 175}, {silty, seedB, 180}, {clay, seedB, 165}, {sandy, seedA, 168}, {clay, seedA, 184}, {sandy, seedB, 171}, {sandy, seedB, 173}, {sandy, seedA, 189}, {clay, seedA, 186}, {silty, seedB, 174}, {clay, seedA, 192}, {clay, seedA, 184}, {clay, seedA, 179}, {sandy, seedA, 182}, {sandy, seedB, 177}, {silty, seedA, 180}, {clay, seedB, 175}, {silty, seedB, 181}, {sandy, seedA, 176}, {silty, seedB, 190}};将 First 与 GatherBy 联用,根据每个数据点的第一个元素将数据归类,可以使数据按照土壤类型分组:
bySoilType = GatherBy[agdata, First]各种土壤类型下的平均产量可以从每个列表中提取土壤类型并计算列表中的产量(最后一个元素)的 Mean 得到. 与上面的迭代变量 x 的可能值为该 3 个团体,您可以使用表以获得这些结果. 用迭代变量 x 的可能值表示上面的三个组,您可以用 Table 得到结果.
使用 Table 得到各组的土壤类型和平均产量:
Table[{x[[1, 1]], N[Mean[x[[All, -1]]]]}, {x, bySoilType}]如要获得基于种子类型的产量信息,首先根据每个数据点的第二个元素对数据分组.
将纯函数 #[[2]]& 与 GatherBy 联用,根据种子类型归类数据:
bySeedType = GatherBy[agdata, #[[2]]&]计算不同种子类型时的平均产量与上面针对不同土壤类型平均产量的计算非常相似. 不同的是,使用的是根据 bySeedType 新分组的数据. 并且,提取的是第二个元素以得到种子类型.
使用 Table 计算各类种子的平均产量:
Table[{x[[1, 2]], N[Mean[x[[All, -1]]]]}, {x, bySeedType}]也可以计算其它描述统计量. 例如,您可能希望知道随种子品种不同,产量的变化幅度,即最大产量与最大产量.
Table[{x[[1, 2]], {N[Min[x[[All, -1]]]], N[Max[x[[All, -1]]]]}}, {x, bySeedType}]下列数据表示的是针对一种特定病情进行治疗的一组病人的药物类型、病人年龄以及恢复时间:
meddata = {{drugB, 67, 18}, {drugB, 48, 18}, {drugA, 33, 16}, {drugB, 76, 33}, {drugB, 33, 3}, {placebo, 40, 15}, {drugB, 78, 28}, {drugB, 54, 13}, {placebo, 46, 23}, {drugA, 36, 12}, {drugA, 69, 30}, {drugA, 78, 40}, {placebo, 77, 37}, {drugA, 79, 36}, {drugA, 45, 16}, {drugA, 36, 18}, {drugA, 58, 24}, {placebo, 25, 9}, {drugB, 75, 25}, {drugB, 22, 3}, {placebo, 51, 25}, {placebo, 27, 8}, {placebo, 47, 20}, {placebo, 69, 34}, {drugB, 52, 16}};正如玉米产量的示例一样,您可以根据一列数据对数据分组,并计算不同组的结果.
byDrug = GatherBy[meddata, First]下列函数可用于获取一个值列表的样本大小、均值、中位数和变化范围:
describe[values_] := {Length[values], Mean[values], Median[values], {Min[values], Max[values]}}将 Table 与 describe 联用计算基于药物的描述统计量. 各种药物类型结果的排序与 describe 的定义(样本大小、均值、中位数、样本变化范围)中所用的一致:
Table[{x[[1, 1]], describe[N[x[[All, -1]]]]}, {x, byDrug} ]当根据年龄分组时,您可能希望创建的组对应于一个年龄段,而不仅是一个个单个的年龄. 在这个例子中,每十岁一个年龄段将病人按年龄分组.
如要这样分组,将每个年龄除以10,然后用 IntegerPart 提取小数点左边的整数位. GatherBy 基于这个数字将数据归到各个年龄段:
byAgeGroup = GatherBy[meddata, IntegerPart[#[[2]] / 10]&]将 Table 与 describe 联用,按年龄组别计算描述统计量. Sort 按各年龄组别将数据进行增序排序:
Table[{10IntegerPart[x[[1, 2]] / 10], describe[N[x[[All, -1]]]]}, {x, byAgeGroup}]//Sort此外,也可以通过多个条件对数据分组. 例如,通过在 GatherBy 中以列表形式指定 First 和 IntegerPart,可以将医疗数据按药物及年龄组别进行分组.
byDrugAndAgeGroup = GatherBy[meddata, {First[#], IntegerPart[#[[2]] / 10]}&]正如前面所述,可以对分组的数据计算统计量. 在这里,数据按药物类型排序,并在一个 Grid 中显示:
Table[{x[[1, 1]], 10IntegerPart[x[[1, 2]] / 10], describe[N[x[[All, -1]]]]}, {x, byDrugAndAgeGroup}]//Sort//Grid关于数据表格的显示与格式化,请参见 How to: 使用表格.