[英]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
中的matrix
与setdiff
和分配这些“身份证”不在“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.