Julia的数组或者矩阵可以设置行名和列名么

大家好, 我是julia的新手, 在此想请教一个问题:

Julia中如何设置行名和列名, 因为我需要对行名和列名进行过滤筛选.

比如在R中:

> R_test = matrix(1:16,4,4)
> colnames(R_test) = rownames(R_test) = c("A","B","C","D")
> R_test
  A B  C  D
A 1 5  9 13
B 2 6 10 14
C 3 7 11 15
D 4 8 12 16
> id = c("B","C")
> R_test[id,id]
  B  C
B 6 10
C 7 11

这里, 我生成了一个4*4的矩阵, 行名和列名分别是A,B,C,D,我想根据ID(B和C)提取相应的子矩阵. 在R里面操作如上.

Julia中如何操作?
我的错误的代码:

julia_test = reshape(collect(1:16),4,4)
colnames(julia_test) = rownames(julia_test) =["A","B","C","D"]
julia_test
colnames(julia_test)
id = ["B","C"]
julia_test[id,id]

非常感谢.

你可能需要 DataFrames | Julia By Example

using Pkg
Pkg.add("DataFrames")

using DataFrames

julia_test = reshape(collect(1:16),4,4)
df = DataFrame(julia_test)
names!(df, [Symbol(i) for i in ["A","B","C","D"]])
julia_test
df
df[1:2, [:A,:B]]
julia> julia_test = reshape(collect(1:16),4,4)
4×4 Array{Int64,2}:
 1  5   9  13
 2  6  10  14
 3  7  11  15
 4  8  12  16

julia> df = DataFrame(julia_test)
4×4 DataFrame
│ Row │ x1 │ x2 │ x3 │ x4 │
├─────┼────┼────┼────┼────┤
│ 1   │ 1  │ 5  │ 9  │ 13 │
│ 2   │ 2  │ 6  │ 10 │ 14 │
│ 3   │ 3  │ 7  │ 11 │ 15 │
│ 4   │ 4  │ 8  │ 12 │ 16 │

julia> names!(df, [Symbol(i) for i in ["A","B","C","D"]])
4×4 DataFrame
│ Row │ A │ B │ C  │ D  │
├─────┼───┼───┼────┼────┤
│ 1   │ 1 │ 5 │ 9  │ 13 │
│ 2   │ 2 │ 6 │ 10 │ 14 │
│ 3   │ 3 │ 7 │ 11 │ 15 │
│ 4   │ 4 │ 8 │ 12 │ 16 │

julia> julia_test
4×4 Array{Int64,2}:
 1  5   9  13
 2  6  10  14
 3  7  11  15
 4  8  12  16

julia> df
4×4 DataFrame
│ Row │ A │ B │ C  │ D  │
├─────┼───┼───┼────┼────┤
│ 1   │ 1 │ 5 │ 9  │ 13 │
│ 2   │ 2 │ 6 │ 10 │ 14 │
│ 3   │ 3 │ 7 │ 11 │ 15 │
│ 4   │ 4 │ 8 │ 12 │ 16 │

julia> df[1:2, [:A,:B]]
2×2 DataFrame
│ Row │ A │ B │
├─────┼───┼───┤
│ 1   │ 1 │ 5 │
│ 2   │ 2 │ 6 │

改名参考

数据框不能支持矩阵的操作, 我想知道julia中有没有类似上面R语言的功能.

可以通过矩阵行名和列名的筛选. 而且,我没有找到Julia设置行名和列名的方法.

找了一下没找到改行号的,改列名就跟上面我说的一样

取出某一行/某一列,取出矩阵就结合一下

julia> df
4×4 DataFrame
│ Row │ A │ B │ C  │ D  │
├─────┼───┼───┼────┼────┤
│ 1   │ 1 │ 5 │ 9  │ 13 │
│ 2   │ 2 │ 6 │ 10 │ 14 │
│ 3   │ 3 │ 7 │ 11 │ 15 │
│ 4   │ 4 │ 8 │ 12 │ 16 │

julia> df[2]
4-element Array{Int64,1}:
 5
 6
 7
 8

julia> df[2]'
1×4 LinearAlgebra.Adjoint{Int64,Array{Int64,1}}:
 5  6  7  8

julia> df[:B]
4-element Array{Int64,1}:
 5
 6
 7
 8

julia> df[:, 2]
4-element Array{Int64,1}:
 5
 6
 7
 8

julia> df[2, :]
1×4 DataFrame
│ Row │ A │ B │ C  │ D  │
├─────┼───┼───┼────┼────┤
│ 1   │ 2 │ 6 │ 10 │ 14 │

更多 DF 使用示例

我想到了一个解决方案:
1, 原始的行名和列名ID1
2, 需要提取的行名和列名ID2
3, 因为Array都是从1开始的数字编号, 所以构建一个Dict, 将ID1作为keys, 将数字编号作为values
4, 将ID2作为keys, 提取对应的数字编号values, 命名为re
5, 使用ID2对应的re提取矩阵的子矩阵.

代码如下:

julia_test = reshape(collect(1:16),4,4)
id1 =["a","b","c","d"]
j =1
tt = Dict()
for i in id1
    get!(tt,i,j)
    j = j+1
end
tt
id2 = ["b","c"]
re =[]
for i in id2
    push!(re,tt[i])
end
re
julia_test[re,re]

结果如下:

Main> julia_test = reshape(collect(1:16),4,4)
4×4 Array{Int64,2}:
 1  5   9  13
 2  6  10  14
 3  7  11  15
 4  8  12  16

Main> id1 =["a","b","c","d"]
4-element Array{String,1}:
 "a"
 "b"
 "c"
 "d"

Main> j =1
1

Main> tt = Dict()
Dict{Any,Any} with 0 entries

Main> for i in id1
           get!(tt,i,j)
           j = j+1
       end

Main> tt
Dict{Any,Any} with 4 entries:
  "c" => 3
  "b" => 2
  "a" => 1
  "d" => 4

Main> id2 = ["b","c"]
2-element Array{String,1}:
 "b"
 "c"

Main> re =[]
0-element Array{Any,1}

Main> for i in id2
           push!(re,tt[i])
       end

Main> re
2-element Array{Any,1}:
 2
 3

Main> julia_test[re,re]
2×2 Array{Int64,2}:
 6  10
 7  11
2 个赞
2 个赞