【问题标题】:R - Writing individual values in a matrix using matching to create vector of coordinates in RR - 使用匹配在矩阵中写入单个值以在 R 中创建坐标向量
【发布时间】:2018-04-15 06:05:31
【问题描述】:

假设我创建了一个具有指定行数和列数的 0 矩阵:

r = 100
c = 100
zero_mat = matrix(rep(0, r*c),r,c)

我还有一个包含 100 行长的美国州名的向量,它看起来像:

states[1:7,1] #structured as a matrix with 1 column and many rows
California 
Arizona 
Wisconsin             
California         
Washington 
Washington 
Washington

那么,假设我只是将 zero_mat 的列名设为州名:

colnames(zero_mat) = t(unique(states))

现在,问题来了。如何将 1 写入 zero_map 中的元素 对应于状态所在的行,states 和列 对应州名?

我确定这只是 1 行代码,但我花了几个小时试图弄清楚它无济于事。我认为这可能有效:zero_mat[1:r, states[1:r,1]] = 1,但它只返回一个 1 的矩阵。

【问题讨论】:

    标签: r matrix match coordinates overwrite


    【解决方案1】:

    我希望我能正确理解这个问题。假设这是您的数据:

    states = c('Ca', 'Ar', 'Wi', 'Ca', 'Wa', 'Wa', 'Wa')
    

    你的zero_mat 和它的列名是这样定义的:

    states_uniq = unique(states)
    zero_mat = matrix(0, ncol=length(states_uniq), nrow=length(states))
    colnames(zero_mat) = states_uniq
    
    ##      Ca Ar Wi Wa
    ## [1,]  0  0  0  0
    ## [2,]  0  0  0  0
    ## [3,]  0  0  0  0
    ## [4,]  0  0  0  0
    ## [5,]  0  0  0  0
    ## [6,]  0  0  0  0
    ## [7,]  0  0  0  0
    

    您可以使用match 查找statesstates_uniq 中的位置

    match(states, states_uniq)
    ## [1] 1 2 3 1 4 4 4
    

    这些将是您要在zero_mat 中设置的1s 的列索引。相应的行索引只是1:length(states)。所以你的1s 的行和列索引,收集在一个 2 列矩阵的行中如下:

    cbind(1:length(states), match(states, states_uniq))
    ##      [,1] [,2]
    ## [1,]    1    1
    ## [2,]    2    2
    ## [3,]    3    3
    ## [4,]    4    1
    ## [5,]    5    4
    ## [6,]    6    4
    ## [7,]    7    4
    

    这个2列矩阵可用于索引zero_mat并将对应的条目设置为1

    zero_mat[ cbind(1:length(states), match(states, states_uniq)) ] = 1
    
    ##      Ca Ar Wi Wa
    ## [1,]  1  0  0  0
    ## [2,]  0  1  0  0
    ## [3,]  0  0  1  0
    ## [4,]  1  0  0  0
    ## [5,]  0  0  0  1
    ## [6,]  0  0  0  1
    ## [7,]  0  0  0  1
    

    如果数据集很大,您可能希望使用Matrix 包中的稀疏矩阵来节省空间:

    Matrix::sparseMatrix(i=1:length(states), 
                         j=match(states, states_uniq), 
                         x=1, 
                         dimnames=list(NULL, states_uniq))
    
    ## 7 x 4 sparse Matrix of class "dgCMatrix"
    ##      Ca Ar Wi Wa
    ## [1,]  1  .  .  .
    ## [2,]  .  1  .  .
    ## [3,]  .  .  1  .
    ## [4,]  1  .  .  .
    ## [5,]  .  .  .  1
    ## [6,]  .  .  .  1
    ## [7,]  .  .  .  1
    

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多