loc

语法

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