2013-09-06 3 views
3

다른 행렬의 값이 몇 가지 기준을 충족하면 행렬의 요소로 연산을 수행하려고합니다. 나는 행과 열을 사용하여 for 루프로 해결하는 방법을 알고 있지만 R에서 그것을 수행하는 더 효율적인 방법이 있다고 확신한다. 나는 apply(...,c(1,2),FUN)을 시도했지만 cond의 요소로가는 방법을 모른다. 그 값을 확인 :행과 열을 루프없이 다른 행렬의 값으로 적용 R

m <- matrix(rnorm(9),3,3) 
cl <- c('a','b','c') 
cond <- matrix(sample(cl,9,replace=T),3,3) 
res.m <- apply(m, c(1,2), function(x) if (cond == 'a') { x*10 } if (cond == 'b') { x*-10 } else { 0 } 

답변

2

여기에 아주 간단한 방법입니다. 명명 된 벡터를 사용하여 조건을 설정하십시오.

set.seed(1) 
m <- matrix(rnorm(9),3,3) 
cl <- c('a','b','c') 
cond <- matrix(sample(cl,9,replace=T),3,3) 
m 
#   [,1]  [,2]  [,3] 
# [1,] -0.6264538 1.5952808 0.4874291 
# [2,] 0.1836433 0.3295078 0.7383247 
# [3,] -0.8356286 -0.8204684 0.5757814 

cond 
#  [,1] [,2] [,3] 
# [1,] "b" "a" "a" 
# [2,] "c" "b" "b" 
# [3,] "c" "a" "a" 

둘째, 하나 개의 좋은 소형 라인에서 솔루션 :

먼저, 여기에 내가 함께 일하고 있어요 데이터입니다.

m * c(a = 10, b = -10, c = 0)[cond] 
#   [,1]  [,2]  [,3] 
# [1,] 6.264538 15.952808 4.874291 
# [2,] 0.000000 -3.295078 -7.383247 
# [3,] 0.000000 -8.204684 5.757814 

기본적으로 c(a = 10, b = -10, c = 0)[cond] 당신이에 의해 원래의 행렬을 곱하는 데 사용할 수있는 벡터를 만들려면 "COND"매트릭스를 사용합니다.

+0

참으로 트릭 정말 !! –

+0

@Ananda Mahto 아주 예쁜 하나 감사합니다! – nopeva

2

당신이 시도 할 수 :

m[conda] <- m[conda <- cond == 'a'] * 10 
m[condb] <- m[condb <- cond == 'b'] * -10 
m[!conda & !condb] <- 0 
+0

감사합니다. 한 번에 할 수 있습니까? – nopeva

+0

이 솔루션은 저에게 적합하지 않습니다. 나는'Error : object '를 찾지 못했습니다. 아이디어? – A5C1D2H2I1M1N2O1R2T1

+0

네 말이 맞아. 해결했습니다 –

관련 문제