2016-08-17 3 views
1

값이 사람은 내 머리를 깨는 . 승자는 행렬에있는 행의 패자와 패자입니다. 나는 그들의 패자는 다른 전투 승리 횟수 (각 우승자)를 계산해야합니다요소가 제로가 아닌 경우, 일치하는 행을 추가가

| A | B | C | D 
A| 0 | 0 | 1 | 1 
B| 1 | 0 | 1 | 0 
C| 0 | 0 | 0 | 1 
D| 0 | 1 | 1 | 0 

그래서 내가 변수 L를 작성하고자하는 각 개인을 위해, 그 경우/그녀가 승리하도록 (패자는 승리) 다른 개인, 그들의 행 합계가 합계에 추가됩니다. 이 예에서, 새로운 변수는 다음과 같이 보일 것이다 :

| A | B | C | D | L 
A| 0 | 0 | 1 | 1 | 3 (1 win from C, 2 from D) 
B| 1 | 0 | 1 | 0 | 3 (2 wins from A, 1 from C) 
C| 0 | 0 | 0 | 1 | 2 (2 wins from D) 
D| 0 | 1 | 1 | 0 | 3 (2 wins from B, 1 from D) 

은 내가 에 대한 루프를 시도하고 사용하여 각 개인에 대한 rowSums을 얻는 것을 처리했다 :

내가 아는
l=c() 
for (i in 1:nrow(df)){ 
l[i]=rowSums(df[i,]) 
} 
loserwinners=data.frame(l,row.names=rownames(df)) 

, 골드 스타를 , whoopee. 그러나 값이 0이 아니면 행렬 내에서 호출 할 논리적 명령문을 알지 못합니다. 열 이름을 행 이름과 일치시키고 해당 행의 값을 합계에 추가하십시오. 이 작업을 수행하는 방법에 대한 단서가 있으면 감사하겠습니다. 구문이 잘못된 경우 사과드립니다.

답변

3

이와 비슷한 것으로 생각됩니다. 행을 가로 질러 applyMARGIN = 1으로 반복하십시오. 각 행에서 0보다 큰 열을 식별하고 이름을 저장하십시오. 그런 다음 각 열 이름에 해당하는 행의 모든 ​​값을 합합니다.

fights <- matrix(c(0L, 0L, 1L, 1L, 
        1L, 0L, 1L, 0L, 
        0L, 0L, 0L, 1L, 
        0L, 1L, 1L, 0L), 
       nrow = 4, byrow = TRUE) 
rownames(fights) <- colnames(fights) <- LETTERS[1:4] 

L <- apply(fights, 1, function(x) { 
    who_lost <- names(which(x > 0)) 
    sum(fights[who_lost, ]) 
}) 

cbind(fights, L) 

## A B C D L 
## A 0 0 1 1 3 
## B 1 0 1 0 3 
## C 0 0 0 1 2 
## D 0 1 1 0 3 

편집 : 당신의 행과 열이 같은 순서로에있는 경우 아래 내 댓글에 확장하려면 names(which())는 중복 :

일이
L <- apply(fights, 1, function(x) { 
    who_lost <- x > 0 
    sum(fights[who_lost, ]) 
}) 

cbind(fights, L) 

## A B C D L 
## A 0 0 1 1 3 
## B 1 0 1 0 3 
## C 0 0 0 1 2 
## D 0 1 1 0 3 
+0

앤디, 정말 고마워요 완벽하게, 그리고 정말 멋진 코드 조각입니다. 나는 화가났다. 내가 며칠 동안 일해 왔던 일에 당신이 너무 적은 시간을 보냈다! 좋은 분! –

+0

도움이 되니 기쁩니다! * 함수 패밀리를 이해하는 것을 배우는 것이 R을보다 효율적으로 사용하는 데있어서 가장 큰 도약을 가져다 준 것 중 하나였습니다. NB :이 예제의 경우 행렬이 정사각형이고 행과 열이 항상 같은 순서로 있으면 names() 함수를 생략 할 수 있습니다. (그 점에 관해서는 이제 더 많은 점을 생각하면 which() 함수 게다가). 그러나 이름을 사용하는 것이 더 안전하다고 생각합니다. – andyteucher

관련 문제