r - 표시 - 매트랩 그래프 자르기
이진 지표 매트릭스에서 요소를 생성하는 방법은 무엇입니까? (4)
다음 5 개의 관측 세트에 대한 레벨 A
, B
및 C
의 2 진 표시기 매트릭스 인 다음 매트릭스 mat
가 있다고 가정 해보십시오.
mat <- matrix(c(1,0,0,
1,0,0,
0,1,0,
0,1,0,
0,0,1), ncol = 3, byrow = TRUE)
colnames(mat) <- LETTERS[1:3]
> mat
A B C
[1,] 1 0 0
[2,] 1 0 0
[3,] 0 1 0
[4,] 0 1 0
[5,] 0 0 1
출력을 fac
정의와 같은 단일 요소로 변환하고 싶습니다.
> fac <- factor(rep(LETTERS[1:3], times = c(2,2,1)))
> fac
[1] A A B B C
Levels: A B C
mat
의 이름에서 레이블을 얻었지만 숫자 코드 세트 (예 : c(1,1,2,2,3)
)가 원하는 출력으로 받아 들여질 수있는 경우 추가 점.
다음과 같이 사용할 수 있습니다.
lvls<-apply(mat, 1, function(currow){match(1, currow)})
fac<-factor(lvls, 1:3, labels=colnames(mat))
여기 또 다른 것이있다.
factor(rep(colnames(mat), colSums(mat)))
한 가지 방법은 행 번호로 이름을 복제하고 매트릭스로 직접 색인을 작성한 다음이를 factor
로 감싸서 레벨을 복원하는 것입니다.
factor(rep(colnames(mat), each = nrow(mat))[as.logical(mat)])
[1] A A B B C
Levels: A B C
이것이 model.matrix에서 온 경우, colnames 앞에 fac
가 붙어 있기 때문에 동일하게 작동하지만 여분의 텍스트는 제거해야합니다.
factor(gsub("^fac", "", rep(colnames(mat), each = nrow(mat))[as.logical(mat)]))
행렬 곱셈을 사용한 (그리고 지금까지 가장 짧은) 우아한 솔루션 :
as.factor(colnames(mat)[mat %*% 1:ncol(mat)])