繁体   English   中英

基于另一个数据框 R 更改整行的值

[英]Change values for entire rows based on another data frame R

我有一个很大的、有向的友谊邻接矩阵。 调查数据中不存在一些观察结果。 对于那些不在调查数据框中的观察,我想将其行中的所有值重新编码为 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

我们可以利用的row.names中的matrixsetdiff和分配这些“身份证”不在“DF”至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))

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

#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))

这是另一个基本的 R 选项

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM