我有一个带数值的元素矩阵,例如:
> mtx <- as.matrix(read.csv("matrix.csv", header = TRUE, row.names = 1,sep = ","))
> head(mtx)
BE BG EE ES FI
BE 0.00 0.75 0.17 0.28 0.48
BG 0.75 0.00 0.92 1.03 1.24
EE 0.17 0.92 0.00 0.11 0.31
ES 0.28 1.03 0.11 0.00 0.20
我想根据列和行的名称将某些元素中的值替换为零。也就是说,当列“BE”与行“ES”相交时我想要为零,反之亦然,即当列“ES”与行“BE”相交时,我希望得到:
BE BG EE ES FI
BE 0.00 0.75 0.17 0.00 0.00
BG 0.75 0.00 0.92 1.03 1.24
EE 0.17 0.92 0.00 0.11 0.31
ES 0.00 1.03 0.11 0.00 0.00
我必须对许多矩阵执行此操作,这些矩阵比此示例大,因此需要更换> 150对。这是data structure。需要更换:
c('BE', 'FI', 'FR', 'DE', 'IE', 'NL', 'NO', 'SE', 'CH', 'GB', 'DK','PT','ES')
我找到了函数replace
,但它显然只是基于应用于值的条件,而不是基于包含它们的元素的行和列的名称......
答案 0 :(得分:1)
由于对角线为零,我们可以对行/列进行子集化并将其分配给0
mtx[c("BE", "ES"), c("ES", "BE")] <- 0
答案 1 :(得分:0)
akrun的答案很好。我在这里添加了解决方案,希望对您有所帮助。
可以通过将行名和列名过滤为一组名称来操纵矩阵。
例如:
a=matrix(1:9,3,3)
dimnames(a) <- list(c("x","y","z"),c("x","y","z"))
a[(rownames(a) %in% c("a")), colnames(a) %in% c("d")] <- 0
但是我认为您希望在某些对角线位置为零;因此解决方案将是:
a <- matrix(1:9,3,3)
dimnames(a) <- list(c("x","y","z"),c("x","y","z"))
rows <- c("x","z")
ind <- which(rownames(a) %in% rows)
diag(a)[ind] <- 0