loc
New in version 2.00.8.
语法
loc(obj, rowFilter, [colFilter], [view=false])
参数
obj 矩阵对象,可以是普通矩阵、索引序列以及索引矩阵。
rowFilter/colFilter 可以为以下类型:
布尔向量,只有为 true 的行/列可以被保留。其长度必须和矩阵的行数/列数相等。
与行/列标签【类型兼容】的标量,向量或数据对(表示范围,包含左、右边界)。
注意:
如果 rowFilter/colFilter 为数据对,则 obj 必须是索引序列或索引矩阵。
类型兼容:INT, SHORT, LONG, CHAR 互相兼容, FLOAT 和 DOUBLE 类型互相兼容,SYMBOL 和 STRING 类型互相兼容。
view 布尔值,默认值是 false,表示生成一个原矩阵的副本(深拷贝)。若为 true,只会生成原矩阵的一个视图(浅拷贝),若原数据发生改变,视图的数据也会相应变化。
详情
通过标签或布尔向量获取矩阵指定的行和列的元素,返回一个原矩阵的副本/视图。
例子
$ m=rand(12, 3:4)
$ m;
col1 |
col2 |
col3 |
col4 |
---|---|---|---|
3 |
10 |
6 |
5 |
4 |
11 |
6 |
0 |
7 |
2 |
1 |
8 |
$ a = m.loc(colFilter=[true, true, true, false], view=true)
$ b = m.loc(colFilter=[true, true, true, false], view=false)
$ a;
col1 |
col2 |
col3 |
---|---|---|
3 |
10 |
6 |
4 |
11 |
6 |
7 |
2 |
1 |
$ b;
col1 |
col2 |
col3 |
---|---|---|
3 |
10 |
6 |
4 |
11 |
6 |
7 |
2 |
1 |
// 若原矩阵发生变化则视图也会改变,副本则不发生变化
$ m[0,0] = -1
$ a;
col1 |
col2 |
col3 |
---|---|---|
-1 |
10 |
6 |
4 |
11 |
6 |
7 |
2 |
1 |
$ b;
col1 |
col2 |
col3 |
---|---|---|
3 |
10 |
6 |
4 |
11 |
6 |
7 |
2 |
1 |
$ m = rand(48, 6:8)
$ m;
col1 |
col2 |
col3 |
col4 |
col5 |
col6 |
col7 |
col8 |
---|---|---|---|---|---|---|---|
27 |
31 |
47 |
21 |
12 |
43 |
22 |
11 |
3 |
20 |
13 |
37 |
3 |
46 |
27 |
27 |
13 |
5 |
14 |
11 |
26 |
42 |
4 |
18 |
45 |
9 |
31 |
33 |
12 |
19 |
42 |
17 |
2 |
19 |
30 |
25 |
36 |
27 |
21 |
6 |
9 |
36 |
15 |
10 |
29 |
37 |
31 |
42 |
// 通过布尔值过滤
$ m.loc(rowFilter=[true, true, false, false, true, false])
col1 |
col2 |
col3 |
col4 |
col5 |
col6 |
col7 |
col8 |
---|---|---|---|---|---|---|---|
27 |
31 |
47 |
21 |
12 |
43 |
22 |
11 |
3 |
20 |
13 |
37 |
3 |
46 |
27 |
27 |
2 |
19 |
30 |
25 |
36 |
27 |
21 |
6 |
$ m.loc(colFilter=[true, true, false, false, true, false, false, true])
col1 |
col2 |
col3 |
col4 |
---|---|---|---|
27 |
31 |
12 |
11 |
3 |
20 |
3 |
27 |
13 |
5 |
26 |
18 |
45 |
9 |
12 |
17 |
2 |
19 |
36 |
6 |
9 |
36 |
29 |
42 |
// 通过标签过滤
$ m.rename!(`A`A`B`A`B`B, 2022.01.01 + 0..7)
$ m;
label |
2022.01.01 |
2022.01.02 |
2022.01.03 |
2022.01.04 |
2022.01.05 |
2022.01.06 |
2022.01.07 |
2022.01.08 |
---|---|---|---|---|---|---|---|---|
A |
27 |
31 |
47 |
21 |
12 |
43 |
22 |
11 |
A |
3 |
20 |
13 |
37 |
3 |
46 |
27 |
27 |
B |
13 |
5 |
14 |
11 |
26 |
42 |
4 |
18 |
A |
45 |
9 |
31 |
33 |
12 |
19 |
42 |
17 |
B |
2 |
19 |
30 |
25 |
36 |
27 |
21 |
6 |
B |
9 |
36 |
15 |
10 |
29 |
37 |
31 |
42 |
$ m.loc(rowFilter=`A);
label |
2022.01.01 |
2022.01.02 |
2022.01.03 |
2022.01.04 |
2022.01.05 |
2022.01.06 |
2022.01.07 |
2022.01.08 |
---|---|---|---|---|---|---|---|---|
A |
27 |
31 |
47 |
21 |
12 |
43 |
22 |
11 |
A |
3 |
20 |
13 |
37 |
3 |
46 |
27 |
27 |
A |
45 |
9 |
31 |
33 |
12 |
19 |
42 |
17 |
$ m.loc(colFilter=2022.01.02);
label |
2022.01.02 |
---|---|
A |
31 |
A |
20 |
B |
5 |
A |
9 |
B |
19 |
B |
36 |
$ m.loc(rowFilter=`B, colFilter=2022.01.03)
label |
2022.01.03 |
---|---|
B |
14 |
B |
30 |
B |
15 |
若 rowFilter / colFilter 是数据对,则 obj 必须是索引矩阵,可通过函数 setIndexedMatrix! 将一个带标签的矩阵设置为索引矩阵。
$ m = rand(30, 5:6).rename!(1..5, 2022.01.01 + 0..5)
$ m.setIndexedMatrix!()
$ m;
label |
2022.01.01 |
2022.01.02 |
2022.01.03 |
2022.01.04 |
2022.01.05 |
2022.01.06 |
---|---|---|---|---|---|---|
1 |
5 |
27 |
26 |
18 |
29 |
3 |
2 |
11 |
12 |
21 |
15 |
3 |
3 |
3 |
1 |
23 |
29 |
17 |
7 |
18 |
4 |
1 |
6 |
12 |
27 |
23 |
23 |
5 |
15 |
7 |
3 |
19 |
4 |
8 |
$ m.loc(rowFilter=2:4, colFilter=2022.01.03:2022.01.06)
label |
2022.01.03 |
2022.01.04 |
2022.01.05 |
2022.01.06 |
---|---|---|---|---|
2 |
21 |
15 |
3 |
3 |
3 |
29 |
17 |
7 |
18 |
4 |
12 |
27 |
23 |
23 |
相关函数:at