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