2012-02-29 2 views
7

이름이 지정된 행 ('a'및 'b')과 명명 된 열 ('10', '20', '30', '40')이있는 논리 행렬 x이 있습니다. 예를 들어 다음과 같습니다.R : 행렬의 실제 요소의 행과 열 이름을 얻는 방법?

10 20 30 40 
a T F T F 
b F T F T 

structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), 
.Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40"))) 

실제 값이있는 행 및 열 이름을 나열하는 표를 얻는 간단한 방법이 있습니까?

row col 
a 1 1 
b 2 2 
a 1 3 
b 2 4 

을 생산 which(x, arr.ind = T)에 의해 얻어 질 수있다 유사한

a 10, 30 
b 20, 40 

뭔가,하지만 난 정말 첫 번째 테이블을 얻으려면 : 그건 내가 다음 표를 얻으려면입니다.

답변

11

apply을 직접 사용할 수 있습니다.

당신은 table 객체가 as.data.frame()에 의해 "긴"형식의 데이터 프레임을 전환하고 있다는 사실 사용할 수 있습니다
+2

+1 :'t (t (적용 (m, 1, 기능 (U) 붙여 넣기 (이름을 (있는 (유)), 붕괴 = ","))))'요청한 결과에 더 가깝고 더 조정할 수 있습니다 – Henry

2

당신은 이것을 지정하지 않았지만 원하는 출력 결과는 사실 직사각형이라고 가정해야합니다. 즉, a에 대해 3 개의 열 이름을 얻지 못하고 b에 대해서만 2 개의 열 이름을 얻지 못합니다.

나는 이것이 당신이 적어도 시작할 수해야한다고 생각 :

원하는 정보를 반환하지만 사각형이 아닌 경우에 질식되지 않습니다 안전한 "긴"형식에
m <- structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), 
.Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40"))) 

rr <- rownames(m)[row(m)[which(m)]] 
cc <- colnames(m)[col(m)[which(m)]] 

dd <- data.frame(rr = rr,cc = cc) 
dd 

. 이 같은 규정 일단 거기, 당신은 그것을 다시 구성 할 수 있습니다 :

library(plyr) 
ddply(dd,.(rr),function(x){ x$cc }) 

하지만 솔직히 마지막 비트가 정말 추하다는 점을 발견하고 조금 기다리면 더 나은 솔루션이 튀어 나올 경우 나는 놀라지 않을 것이다

.

0

apply(
    x, 1, 
    function(u) paste(names(which(u)), collapse=",") 
) 
:

# Create matrix of interest 
mat <- structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), .Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40"))) 

# Convert to table, then to long data.frame 
df <- mat %>% as.table %>% as.data.frame(., stringsAsFactors=FALSE) 

결과 df은 다음과 같다 :

Var1 Var2 Freq 
1 a 10 TRUE 
2 b 10 FALSE 
3 a 20 FALSE 
4 b 20 TRUE 
5 a 30 TRUE 
6 b 30 FALSE 
7 a 40 FALSE 
8 b 40 TRUE 

어떤을 그런 다음 TRUE 개의 행만 남도록 색인을 생성 할 수 있습니다.

df <- df[df$Freq,1:2] %>% sort 
df 
     Var1 Var2 
    1 a 10 
    5 a 30 
    4 b 20 
    8 b 40 

당신은 정확하게 당신이 원하는 테이블에이 변환 dplyr를 사용할 수 있습니다

library(plyr) 
ddply(df, "Var1", function(x) x$Var2) 
    Var1 V1 V2 
1 a 10 30 
2 b 20 40