2012-01-19 7 views
1

가능한 한 빨리 행렬의 일부 행의 첫 번째 0을 다른 벡터에 저장된 값으로 바꾸고 싶습니다.행의 첫 번째 0 요소 바꾸기

숫자 행렬이 있으며 각 행은 몇 개의 0이있는 벡터입니다. 두 개의 벡터가 있습니다. 하나는 행을 포함하고, 하나는 대체 할 문자이고, 다른 하나는 새로운 값인 replace.in.these.rowsnew.values입니다.

matrix[replace.in.these.rows, corresponding.poz.of.the.1st.zero ] <- new.values 

는 트릭이 있습니까 : 또한, 나는 sapply와 첫번째 제로의 벡터를 생성 할 수 있습니다 지금

mat <- matrix(1,5,5) 
mat[c(1,8,10,14,16,22,14)] <- 0 
replace.in.these.rows <- c(1,2,3) 
new.values <- c(91,92,93) 

corresponding.poz.of.1st.zero <- sapply(replace.in.these.rows, 
             function(x) which(mat [x,] == 0)[1]) 

나는 인덱스 벡터을 반복하지만,없이 가능하게 루프에 대한 뭔가를하고 싶습니다 단순 벡터보다 더 많은 색인을 생성합니까? 목록 또는 배열 (예 : 열 단위)을 색인으로 사용할 수 없습니다.

기본적으로 R 행렬은 열 벡터 집합입니다. 데이터를 이전 된 형식으로 저장하면 아무 것도 얻을 수 있습니까? 행 대신 열에서 작업하는 것을 의미합니다.


컨텍스트 :

이 행렬 저장 접촉 ID-S 네트워크들의. 이것은 인접 행렬 n x n이 아니라 n x max.number .ofpartners (또는 n * = 30) 행렬입니다.

네트워크는 기본적으로 edgelist를 사용하지만 "X의 모든 링크"를 함께 저장하려고합니다.

나는 가정하지만, 항상하여 edgelist 정보 (여러 번 시뮬레이션에서 각 라운드)

내가이 선형 적으로 증가하는 매트릭스 형태는 저장보다 빠릅니다 가정을 추출하는 것보다 이것이 더 효율적입니다 있는지 확실하지 않습니다 같은 형식의 목록에있는 동일한 정보.

이러한 문맥 상 가정에 대한 의견도 환영합니다.

+0

'매트릭스 replace.in.these.rows + nrow (매트릭스) * (corresponding.poz.of.the.1st.zero-1)] <- new.values' – James

답변

1

편집 : 첫 번째 제로 대체 할 수있는 경우이 방법은 작동합니다

first0s <-apply(mat[replace.in.these.rows, ] , 1, function(x) which(x==0)[1]) 
mat[cbind(replace.in.these.rows, first0s)] <- new.values 
> mat 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 91 1 1 0 1 
[2,] 1 1 1 1 92 
[3,] 1 93 1 1 1 
[4,] 1 1 0 1 1 
[5,] 1 0 1 1 1 

편집 : 내가 목표는 선택된 행의 모든 ​​0을 교체했고이 접근 방식이라고 생각했다. 완전히 벡터화 방법 :

idxs <- which(mat==0, arr.ind=TRUE) 
# This returns that rows and columns that identify the zero elements 
# idxs[,"row"] %in% replace.in.these.rows 
# [1] TRUE TRUE FALSE FALSE TRUE TRUE 
# That isolates the ones you want. 
# idxs[ idxs[,"row"] %in% replace.in.these.rows , ] 
# that shows what you will supply as the two column argument to "[" 
#  row col 
#[1,] 1 1 
#[2,] 3 2 
#[3,] 1 4 
#[4,] 2 5 
chosen.ones <- idxs[ idxs[,"row"] %in% replace.in.these.rows , ] 
mat[chosen.ones] <- new.values[chosen.ones[,"row"]] 
# Replace the zeros with the values chosen (and duplicated if necessary) by "row". 
mat 
#---------  
[,1] [,2] [,3] [,4] [,5] 
[1,] 91 1 1 91 1 
[2,] 1 1 1 1 92 
[3,] 1 93 1 1 1 
[4,] 1 1 0 1 1 
[5,] 1 0 1 1 1 
+0

좋은 답변과 주석은 로직을 매우 쉽게 따라합니다. +1 –

+0

...하지만 이것은 각 열의 첫 번째 값뿐만 아니라 모든 0 값을 대체합니다! – Tommy

+0

오른쪽. 그게 요청 된 것이라고 생각했습니다. 다른 것이 필요한 경우 쉽게 수정할 수 있습니다. 내가 편집을 놓친 것일까 요? –

관련 문제