groupfilter
按组过滤
语法
说明
表数据
数组数据
示例
过滤二变量表
创建一个包含两个变量的表。
groupID = [1 1 1 2 2 3]'; sample = [3 1 2 9 8 5]'; T = table(groupID,sample)
T=6×2 table
groupID sample
_______ ______
1 3
1 1
1 2
2 9
2 8
3 5
按 ID 编号进行分组,并且返回对应于具有两个以上采样的组的行。
Gnumel = groupfilter(T,"groupID",@(x) numel(x) > 2)
Gnumel=3×2 table
groupID sample
_______ ______
1 3
1 1
1 2
返回所含采样介于 0 和 6 之间的组中的各行。
Gvals = groupfilter(T,"groupID",@(x) min(x) > 0 && max(x) < 6)
Gvals=4×2 table
groupID sample
_______ ______
1 3
1 1
1 2
3 5
按最大值分组
创建一个包含两个变量的表,这两个变量分别表示日期和温度。
daynum = [1 1 1 1 2 2 2 2]'; temp = [67 65 71 55 61 79 58 78]'; T = table(daynum,temp)
T=8×2 table
daynum temp
______ ____
1 67
1 65
1 71
1 55
2 61
2 79
2 58
2 78
按日期分组,并且返回每天最高的两个温度。
G = groupfilter(T,"daynum",@(x) ismember(x,maxk(x,2)))
G=4×2 table
daynum temp
______ ____
1 67
1 71
2 79
2 78
按月分组
创建一个表,其中包含日期和对应的利润。
timeStamps = datetime([2017 3 4; 2017 3 2; 2017 3 15; 2017 4 10; ... 2017 4 14; 2017 4 30; 2017 5 25; ... 2017 5 29; 2017 5 21]); profit = [2032 3071 1185 2587 1998 2899 3112 909 2619]'; T = table(timeStamps,profit)
T=9×2 table
timeStamps profit
___________ ______
04-Mar-2017 2032
02-Mar-2017 3071
15-Mar-2017 1185
10-Apr-2017 2587
14-Apr-2017 1998
30-Apr-2017 2899
25-May-2017 3112
29-May-2017 909
21-May-2017 2619
按月对日期进行分组,返回与当月最大利润对应的行。
Gmax = groupfilter(T,"timeStamps","month",@(x) x == max(x))
Gmax=3×3 table
timeStamps profit month_timeStamps
___________ ______ ________________
02-Mar-2017 3071 Mar-2017
30-Apr-2017 2899 Apr-2017
25-May-2017 3112 May-2017
返回月平均利润大于 2300 美元的组的各行。
Gavg = groupfilter(T,"timeStamps","month",@(x) mean(x) > 2300)
Gavg=3×3 table
timeStamps profit month_timeStamps
___________ ______ ________________
10-Apr-2017 2587 Apr-2017
14-Apr-2017 1998 Apr-2017
30-Apr-2017 2899 Apr-2017
过滤三变量表
创建一个包含九个人信息的表 T
。
groupID = [1 2 3 1 2 3 1 2 3]'; Height = [62 61 59 66 70 72 57 67 71]'; HealthStatus = categorical(["Poor"; "Good"; "Fair"; "Poor"; "Fair"; "Excellent"; "Poor"; "Excellent"; "Fair"]); T = table(groupID,Height,HealthStatus)
T=9×3 table
groupID Height HealthStatus
_______ ______ ____________
1 62 Poor
2 61 Good
3 59 Fair
1 66 Poor
2 70 Fair
3 72 Excellent
1 57 Poor
2 67 Excellent
3 71 Fair
按 ID 号分组,并返回成员身高均不低于 60 的组中的各行。
G1 = groupfilter(T,"groupID",@(x) min(x) >= 60,"Height")
G1=3×3 table
groupID Height HealthStatus
_______ ______ ____________
2 61 Good
2 70 Fair
2 67 Excellent
按 ID 号分组,并返回仅包含健康状况为 Poor
的成员的组中的各行。
G2 = groupfilter(T,"groupID",@(x) all(x == "Poor"),"HealthStatus")
G2=3×3 table
groupID Height HealthStatus
_______ ______ ____________
1 62 Poor
1 66 Poor
1 57 Poor
对向量数据进行过滤
创建一个日期向量和一个与日期对应的利润值向量。
timeStamps = datetime([2017 3 4; 2017 3 2; 2017 3 15; 2017 3 10; ... 2017 3 14; 2017 3 31; 2017 3 25; ... 2017 3 29; 2017 3 21; 2017 3 18]); profit = [2032 3071 1185 2587 1998 2899 3112 909 2619 3085]';
按星期几分组,并计算每组的最大利润。显示最大利润及其对应的组。
[maxDailyProfit,dayOfWeek] = groupfilter(profit,timeStamps, ... "dayname",@(x) x == max(x))
maxDailyProfit = 5×1
3071
1185
2899
3112
2619
dayOfWeek = 5x1 categorical
Thursday
Wednesday
Friday
Saturday
Tuesday
输入参数
T
— 输入表
表 | 时间表
输入表,指定为表或时间表。
A
— 输入数组
列向量 | 矩阵
输入数组,指定为列向量或一组存储为矩阵的列向量。
groupvars
— 分组变量或向量
标量 | 向量 | 矩阵 | 元胞数组 | 函数句柄 | 表 vartype
下标
分组变量或向量,指定为以下选项之一:
对于数组输入数据,
groupvars
可以是一个行数与A
相同的列向量,也可以是一组以矩阵或元胞数组形式排列的列向量。对于表或时间表输入数据,
groupvars
指示使用哪些变量来计算数据中的组。您可以使用下表中的任何选项来指定分组变量。选项 描述 示例 变量名称 指定单个表变量名称的字符向量或字符串标量
'Var1'
"Var1"
变量名称的向量 字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称
{'Var1' 'Var2'}
["Var1" "Var2"]
变量索引的标量或向量 表变量索引的标量或向量
1
[1 3 5]
逻辑向量 逻辑向量,每个元素分别对应一个表变量,其中
true
指示包括对应变量,false
指示不包括对应变量。[true false true]
函数句柄 函数句柄,以表变量作为输入并返回逻辑标量
@isnumeric
vartype
下标由
vartype
函数生成的表下标vartype("numeric")
示例: groupfilter(T,"Var3",method)
method
— 过滤方法
函数句柄
过滤方法,指定为函数句柄。
method
定义用于在每个组中过滤成员的函数。该函数必须返回逻辑标量或与输入数据具有相同行数的逻辑列向量,用于指示要选择的组成员。
如果函数返回逻辑标量,则要么筛除组中的所有成员(当值为
false
),要么不筛除任何成员(当值为true
)。如果函数返回逻辑向量,则对应元素为
false
的组成员将被过滤掉并保留对应元素为true
的成员。
要定义函数句柄,请使用形式为 @(inputargs) mymethod
的语法,其中 mymethod
取决于 inputargs
。
函数可以过滤与满足条件的组对应的行。例如,
@(x) mean(x) > 10
只向输出传递与组均值大于 10 的组对应的行。函数可以过滤对应组中满足条件的行。例如,
@(x) x == max(x)
只将与组中行的最大值对应的行传递给输出。
当 groupfilter
一次性将方法应用于多个非分组变量时,则方法将为每个变量返回一个逻辑标量或向量。对于每一行,只有返回的所有标量或向量中的对应值均为 true
时,才会将该行传递给输出。
groupbins
— 分 bin 方案
"none"
(默认) | 标量 | 向量 | 元胞数组
分 bin 方案,指定为以下选项之一:
"none"
,表示不分 binbin 边界列表,指定为数值向量,或
datetime
分组变量或向量的datetime
向量bin 数量,指定为正整数标量
持续时间,指定为
duration
或calendarDuration
类型的标量,指示 bin 宽度(仅限于datetime
或duration
分组变量或向量)列出每个分组变量或向量的分 bin 方法的元胞数组
时间 bin(仅适用于
datetime
和duration
分组变量或向量),指定为下列字符串之一。值 描述 数据类型 "second"
每个 bin 是 1 秒。
datetime
和duration
"minute"
每个 bin 是 1 分钟。
datetime
和duration
"hour"
每个 bin 是 1 小时。
datetime
和duration
"day"
每个 bin 表示 1 个日历日。此值将夏令时变化考虑在内。
datetime
和duration
"week"
每个 bin 是 1 个日历周。 仅限 datetime
"month"
每个 bin 是 1 个日历月。 仅限 datetime
"quarter"
每个 bin 是 1 个日历季度。 仅限 datetime
"year"
每个 bin 表示 1 个日历年。此值将闰日考虑在内。
datetime
和duration
"decade"
每个 bin 是 1 个十年(10 个日历年)。 仅限 datetime
"century"
每个 bin 是 1 个世纪(100 个日历年)。 仅限 datetime
"secondofminute"
bin 从 0 到 59 秒。
仅限 datetime
"minuteofhour"
bin 从 0 到 59 分钟。
仅限 datetime
"hourofday"
bin 从 0 到 23 小时。
仅限 datetime
"dayofweek"
bin 从 1 到 7 日。一周的第一天是星期天。
仅限 datetime
"dayname"
bin 是一周中某天的全称,例如 "Sunday"
。仅限 datetime
"dayofmonth"
bin 从 1 到 31 天。 仅限 datetime
"dayofyear"
bin 从 1 到 366 天。 仅限 datetime
"weekofmonth"
bin 从 1 到 6 周。 仅限 datetime
"weekofyear"
bin 从 1 到 54 周。 仅限 datetime
"monthname"
bin 是完整的月份名称,如 "January"
。仅限 datetime
"monthofyear"
bin 从 1 到 12 个月。
仅限 datetime
"quarterofyear"
bin 从 1 到 4 个季度。 仅限 datetime
如果指定多个分组变量或向量,则可以提供应用于所有分组变量或向量的单个分 bin 方法,或者提供包含针对每个分组变量或向量(例如 {"none",[0 2 4 Inf]}
)的分 bin 方法的元胞数组。
datavars
— 要对其进行操作的表变量
标量 | 向量 | 元胞数组 | 函数句柄 | 表 vartype
下标
要对其进行操作的表变量,指定为下表中的选项之一。datavars
指示将过滤方法应用于输入表或时间表的哪些变量。未由 datavars
指定的其他变量会传递给输出,而不会对其进行操作。groupfilter
将过滤方法应用于指定的变量,并根据得到的结果从所有变量中删除行。当未指定 datavars
时,groupfilter
对每个非分组变量进行操作。
选项 | 描述 | 示例 |
---|---|---|
变量名称 | 指定单个表变量名称的字符向量或字符串标量 |
|
变量名称的向量 | 字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称 |
|
变量索引的标量或向量 | 表变量索引的标量或向量 |
|
逻辑向量 | 逻辑向量,每个元素分别对应一个表变量,其中 |
|
函数句柄 | 函数句柄,以表变量作为输入并返回逻辑标量 |
|
vartype 下标 | 由 |
|
示例: groupfilter(T,groupvars,method,["Var1" "Var2" "Var4"])
LR
— 包括的 bin 边界
"left"
(默认) | "right"
包括的 bin 边界,指定为 "left"
或 "right"
,指示包括 bin 区间的哪一边。
要指定此参数,必须先指定 groupbins
,且参数的值适用于所有分组变量或向量的所有分 bin 方案。
输出参数
G
— 输出表
表 | 时间表
表或时间表输入数据的输出表,以表或时间表形式返回。G
包含 T
中满足按组过滤方法的行。
B
— 输出数组
向量 | 矩阵
数组输入数据的输出数组,以向量或矩阵形式返回。B
包含 A
中满足按组过滤方法的行。
BG
— 分组向量
列向量 | 列向量元胞数组
数组输入数据的分组向量,以列向量或列向量元胞数组形式返回。BG
包含与 B
中的行对应的唯一分组向量或分 bin 分组向量组合。
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
用法说明和限制:
如果
A
和groupvars
均为 tall 矩阵,则它们必须具有相同的行数。如果第一个输入是 tall 矩阵,则
groupvars
可以是包含 tall 分组向量的元胞数组。groupvars
和datavars
参数不支持函数句柄。method
参数必须是对 tall 数组执行的splitapply
的有效输入。按照离散的日期时间数组分组时,分类组名称将不同于内存中的
groupfilter
计算结果。
有关详细信息,请参阅tall 数组。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
不支持稀疏输入。
日期时间或持续时间数据不支持分 bin 方案。
不支持包含多维数组的输入表。
计算方法必须为常量。
当第一个输入参数是表时,分组变量必须为常量。
数据变量必须为常量。
指定为字符向量或字符串的分 bin 方案必须为常量。
名称-值参数必须为常量。
计算方法不能返回稀疏结果或多维结果。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅Run MATLAB Functions in Thread-Based Environment。
版本历史记录
在 R2019b 中推出R2022b: 代码生成支持
为 groupfilter
函数生成 C 或 C++ 代码。有关用法说明和限制,请参阅 C/C++ 代码生成。
R2022a: 改进了处理小型组时的性能
groupfilter
函数显示性能得到改进,尤其是在每个组中的数据量较小时。
例如,以下代码按组过滤有 500 个组(每个组的计数为 10)的矩阵。该代码比上一版本大约快 2.32 倍。
function timingGroupfilter data = (1:5000)'; groups = repelem(1:length(data)/10,10)'; p = randperm(length(data)); data = data(p); groups = groups(p); tic for k = 1:600 G = groupfilter(data,groups,@(x) x == max(x)); end toc end
大致的执行时间是:
R2021b:2.32 秒
R2022a:1.00 秒
代码是在运行 Windows® 10 的 Intel® Xeon® CPU E5-1650 v4 @ 3.60 GHz 测试系统上通过调用 timingGroupfilter
函数进行计时的。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)