행과 열 이름이 같은 2 차로 행렬 또는 데이터 프레임 확장

Aug 21 2020

행렬 또는 데이터 프레임을 2 차로 쉽게 확장 할 수 있습니다. 즉, 동일한 행과 열 이름이 있습니다. 값이 누락 된 경우 0이되기를 원합니다.

재현 가능한 예 :

cols<-c("A","B","D","F")
rows<-c("A","B","C", "E", "F")
data<-matrix(runif(20),nrow = length(rows), ncol = length(cols))
colnames(data)<-cols
rownames(data)<-rows

따라서 목표는 열 / 행 이름 "A"에서 "F"까지의 6x6 행렬과 데이터 및 누락 된 경우 0으로 채워진 값 을 갖는 것입니다.

아이디어에 감사드립니다!

답변

2 AllanCameron Aug 21 2020 at 21:02

이것은 다소 장황 해 보이지만 행 이름과 열 이름이있는 모든 행렬로 일반화되는 작은 함수가 있습니다.

make_quadratic <- function(data)
{
  names <- sort(unique(c(colnames(data), rownames(data))))
  size  <- length(names)
  
 `colnames<-`(`rownames<-`(apply(apply(data, 1, 
  function(x) replace(numeric(size), names %in% colnames(data), x)), 1, 
  function(x) replace(numeric(size), names %in% rownames(data), x)),
  names), names)
}

예를 들면 다음과 같습니다.

make_quadratic(data)
#>           A         B C         D E          F
#> A 0.1033626 0.4390343 0 0.9368352 0 0.47888726
#> B 0.3897981 0.1563756 0 0.3148652 0 0.79636682
#> C 0.6780338 0.4937433 0 0.1325104 0 0.10266721
#> D 0.0000000 0.0000000 0 0.0000000 0 0.00000000
#> E 0.7667374 0.1198529 0 0.8930371 0 0.35349412
#> F 0.1467854 0.4649394 0 0.5838215 0 0.05615008

편집하다

루프를 포함하지 않는 대체 답변 :

i <- as.matrix(expand.grid(row = which(LETTERS[1:6] %in% rownames(data)),
                           col = which(LETTERS[1:6] %in% colnames(data))))

result <- matrix(0, nrow = 6, ncol = 6, 
                 dimnames = list(LETTERS[1:6], LETTERS[1:6]))

result[i] <- data

result
#>           A         B C         D E          F
#> A 0.1033626 0.4390343 0 0.9368352 0 0.47888726
#> B 0.3897981 0.1563756 0 0.3148652 0 0.79636682
#> C 0.6780338 0.4937433 0 0.1325104 0 0.10266721
#> D 0.0000000 0.0000000 0 0.0000000 0 0.00000000
#> E 0.7667374 0.1198529 0 0.8930371 0 0.35349412
#> F 0.1467854 0.4649394 0 0.5838215 0 0.05615008
2 ThomasIsCoding Aug 21 2020 at 21:19

중첩 for루프를 사용하는 또 다른 기본 R 옵션이 있습니다.

nm <- sort(union(colnames(data),row.names(data)))
res <- `dimnames<-`(matrix(0,nrow = length(nm),ncol = length(nm)),replicate(2,nm,simplify = FALSE))
for (i in rows) {
  for (j in cols) {
    res[i,j] <- data[i,j]
  }
}

주는

> res
           A         B C         D E          F
A 0.02778712 0.1386282 0 0.2263808 0 0.68144251
B 0.52731078 0.3214921 0 0.1314165 0 0.09916910
C 0.88031907 0.1548316 0 0.9815635 0 0.11890256
D 0.00000000 0.0000000 0 0.0000000 0 0.00000000
E 0.37306337 0.1322282 0 0.3270137 0 0.05043966
F 0.04795913 0.2213059 0 0.5069395 0 0.92925392