2013-06-05 1 views
1
z=c("abcD9","recde6","7gfbe","dvS1","MNM09") 
d=c("abcD9","recde6","abcD9","bgfh123","dvS1") 
y <- numeric(length=25) 
k<-1 
for (i in 1:5) { 
    for (j in 1:5) { 
    a <- (z[i]==d[j]) 
    if(a==TRUE) y[k] <- j else y[k] <- 0 
    } 
    k<-k+1 
} 

내가 벡터 (1 0 3 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0)R의 'for 루프'에 어떤 문제가 있습니까?

+0

여러분의 코드에 일부 indented를 추가 했으므로 훨씬 더 읽기 쉽습니다. –

+0

'outer (d, z, "==")'에 대한 출력을보고 R의 벡터화 기능을보다 완벽하게 사용하는 데 도움이되는지 확인할 수 있습니다. –

+0

여기에 3 가지 대답이 있습니다. 수락 할 가치가있는 사람이 없으므로이 질문에 답이없는 것처럼 보이지 않습니까? 그렇지 않은 경우, 이유를 말해주십시오. 감사. –

답변

2
로 'Y'로 결과를 얻을 수 있어야보십시오

당신은 내부 루프에 k<-k+1를 이동하면 그것은 작동합니다

for (i in 1:5) 
{ 
    for (j in 1:5) 
    { 
    a <- (z[i]==d[j]) 
    if(a==TRUE) 
     y[k] <- j 
    else 
     y[k] <- 0 
    k<-k+1 
    } 
} 

결과 (y를)

[1] 1 0 3 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 

그런데 617,451,515,

: 다음 명령을 사용하여 동일한 결과를 얻을 수 있습니다

tmp <- sapply(z, function(vec1) !is.na(match(d, vec1))) 
y <- numeric(length = length(tmp)) 
y[unlist(tmp)] <- which(tmp, arr.ind = TRUE)[ , 1] 
3
내가 더 벡터화/적용 루프 방식 가고 싶어

:

y = do.call('c', lapply(z, function(x) ifelse(x == d, seq_along(d), 0))) 
[1] 1 0 3 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 

또는 expand.grid를 사용하여 :

df = data.frame(expand.grid(d = d, z = z, stringsAsFactors = FALSE), 
       y = rep(seq_along(d), length(z))) 
with(df, ifelse(z == d, y, 0)) 
+0

불필요한 루프를 제거하는 접근법을 보려면 +1하십시오 (이 예에서는 루프 반복의 실행 속도가 빠르기 때문에). –

+0

코드는 짧고, 표현력이 풍부하고, 덜 필수적이며, 기능적으로 더 R 유사합니다. –

3

루프를 제거하고 다음과 같이 벡터화 된 것을 수행 할 수 있습니다.

pos <- t(outer(z , d , FUN = "==")) 
pos[ pos == TRUE ] <- which(pos , arr.ind = TRUE)[,1] 
as.vector(pos) 
#[1] 1 0 3 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 
+1

가장 우아한 것으로 나타납니다. 내 것은 'c (ifelse (outer, d, z, "=="), row (outer (d, z, "=="), 0))'이 될 것입니다. –

관련 문제