【问题标题】:Change values for entire rows based on another data frame R根据另一个数据框 R 更改整行的值
【发布时间】:2021-02-04 21:17:29
【问题描述】:

我有一个庞大的、有向的友谊邻接矩阵。调查数据中不存在一些观察结果。对于那些不在调查数据框中的观察,我想将其行中的所有值重新编码为 10。下面的一些示例数据:

有矩阵:

     1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20
 1   0   1   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 3   1   1   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 4   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 5   1   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 6   0   0   0   0   0   0   1   0   1   0   0   0   0   0   0   0   0   0   0   0
 7   0   0   0   0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0
 8   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
 9   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0
10   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0
11   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0
12   0   0   0   0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   0   0
13   0   0   0   0   0   0   0   0   0   0   1   1   0   1   1   0   0   0   0   0
14   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0
15   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0
16   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   1   0
17   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1
18   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0
19   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0
20   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1   1   0

有 DF:

 id  friendid_1  friendid_2  friendid_3  friendid_4
  1           2           4          NA          NA
  2          NA          NA          NA          NA
  3           1           5           2          NA
  5           1           3          NA          NA
  6           9           7          NA          NA
  7           9          10          NA          NA
  9           6          NA          NA          NA
 10          NA          NA           7          NA
 12          11          15          NA          NA
 13          15          12          14          11
 14          13          NA          NA          NA
 15          12          NA          NA          NA
 17          19          20          NA          NA
 18          17          NA          NA          NA
 20          18          17          19          NA

想要矩阵:

     1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20
 1   0   1   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 3   1   1   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 4  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10
 5   1   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 6   0   0   0   0   0   0   1   0   1   0   0   0   0   0   0   0   0   0   0   0
 7   0   0   0   0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0
 8  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10
 9   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0
10   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0
11  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10
12   0   0   0   0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   0   0
13   0   0   0   0   0   0   0   0   0   0   1   1   0   1   1   0   0   0   0   0
14   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0
15   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0
16  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10
17   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1
18   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0
19  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10
20   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1   1   0

【问题讨论】:

    标签: r for-loop apply data-manipulation


    【解决方案1】:

    我们可以将matrixrow.namessetdiff 一起使用,并将那些不在'DF' 中的'id' 分配给10

    m1[setdiff(row.names(m1), DF$id),] <- 10
    

    -输出

    m1
    #    1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
    #1   0  1  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    #2   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    #3   1  1  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    #4  10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
    #5   1  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    #6   0  0  0  0  0  0  1  0  1  0  0  0  0  0  0  0  0  0  0  0
    #7   0  0  0  0  0  0  0  0  1  1  0  0  0  0  0  0  0  0  0  0
    #8  10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
    #9   0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    #10  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0
    #11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
    #12  0  0  0  0  0  0  0  0  0  0  1  0  0  0  1  0  0  0  0  0
    #13  0  0  0  0  0  0  0  0  0  0  1  1  0  1  1  0  0  0  0  0
    #14  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0
    #15  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0
    #16 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
    #17  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1
    #18  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0
    #19 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
    #20  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1  0
    

    数据

    m1 <- structure(c(0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
    0L, 0L, 0L), .Dim = c(20L, 20L), .Dimnames = list(c("1", "2", 
    "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", 
    "15", "16", "17", "18", "19", "20"), c("1", "2", "3", "4", "5", 
    "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", 
    "17", "18", "19", "20")))
    
    
    
    DF <- structure(list(id = c(1L, 2L, 3L, 5L, 6L, 7L, 9L, 10L, 12L, 13L, 
    14L, 15L, 17L, 18L, 20L), friendid_1 = c(2L, NA, 1L, 1L, 9L, 
    9L, 6L, NA, 11L, 15L, 13L, 12L, 19L, 17L, 18L), friendid_2 = c(4L, 
    NA, 5L, 3L, 7L, 10L, NA, NA, 15L, 12L, NA, NA, 20L, NA, 17L), 
        friendid_3 = c(NA, NA, 2L, NA, NA, NA, NA, 7L, NA, 14L, NA, 
        NA, NA, NA, 19L), friendid_4 = c(NA, NA, NA, NA, NA, NA, 
        NA, NA, NA, 11L, NA, NA, NA, NA, NA)), class = "data.frame", 
        row.names = c(NA, 
    -15L))
    

    【讨论】:

      【解决方案2】:

      我们还可以根据数据框在矩阵上使用索引:

      #Create index
      i <- 1:NROW(Matrix)
      #Contrast with df
      j <- which(!i %in% df$id)
      #Replace
      Matrix[j,] <- 10
      

      输出:

      Matrix
          1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
      1   0  1  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
      2   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
      3   1  1  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
      4  10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
      5   1  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
      6   0  0  0  0  0  0  1  0  1  0  0  0  0  0  0  0  0  0  0  0
      7   0  0  0  0  0  0  0  0  1  1  0  0  0  0  0  0  0  0  0  0
      8  10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
      9   0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0
      10  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0
      11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
      12  0  0  0  0  0  0  0  0  0  0  1  0  0  0  1  0  0  0  0  0
      13  0  0  0  0  0  0  0  0  0  0  1  1  0  1  1  0  0  0  0  0
      14  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0
      15  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0
      16 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
      17  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1
      18  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0
      19 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
      20  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1  0
      

      使用的一些数据:

      #Data1
      Matrix <- structure(c(0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 
      0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
      0L, 0L, 0L), .Dim = c(20L, 20L), .Dimnames = list(c("1", "2", 
      "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", 
      "15", "16", "17", "18", "19", "20"), c("1", "2", "3", "4", "5", 
      "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", 
      "17", "18", "19", "20")))
      
      #Data2
      df <- structure(list(id = c(1L, 2L, 3L, 5L, 6L, 7L, 9L, 10L, 12L, 13L, 
      14L, 15L, 17L, 18L, 20L), friendid_1 = c(2L, NA, 1L, 1L, 9L, 
      9L, 6L, NA, 11L, 15L, 13L, 12L, 19L, 17L, 18L), friendid_2 = c(4L, 
      NA, 5L, 3L, 7L, 10L, NA, NA, 15L, 12L, NA, NA, 20L, NA, 17L), 
          friendid_3 = c(NA, NA, 2L, NA, NA, NA, NA, 7L, NA, 14L, NA, 
          NA, NA, NA, 19L), friendid_4 = c(NA, NA, NA, NA, NA, NA, 
          NA, NA, NA, 11L, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
      -15L))
      

      【讨论】:

        【解决方案3】:

        这是另一个基本 R 选项

        MatrixOut <- matrix(10,nrow(Matrix),ncol(Matrix))
        MatrixOut[DF$id,] <- Matrix[DF$id,]
        

        【讨论】:

          猜你喜欢
          • 2021-11-24
          • 2020-07-19
          • 2021-05-29
          • 1970-01-01
          • 2023-01-18
          • 1970-01-01
          • 2019-03-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多