2015-02-02 4 views
1

내가하고 싶은 일은 루프 대신 apply를 사용하여 두 행의 문자열을 각 행으로 비교하는 것입니다. x.str의 행 하나와 y.str의 행 하나.쌍을 이루는 단어의 배열을 테스트하여 쌍이 공유하는 문자를 찾습니다.

A = array(0,dim=dim(x.str1)) 
for(i in 1:length(x.str[,1])){ 
    A[i,] = ifelse(x.str[i,] %in% y.str[i,],1,0) 
} 

아웃으로 넣어 :

x.str

 [,1] [,2] [,3] [,4] 
[1,] "c" "o" "m" "e" 
[2,] "g" "o" "n" "e" 
[3,] "b" "o" "o" "d" 
[4,] "f" "i" "n" "e" 

y.str

 [,1] [,2] [,3] [,4] 
[1,] "t" "o" "o" "t" 
[2,] "j" "a" "m" "m" 
[3,] "b" "e" "e" "n" 
[4,] "l" "e" "t" "s" 

것은 내가 루프로 쓰려고 한 경우

 [,1] [,2] [,3] [,4] 
[1,] 0 1 1 0 
[2,] 0 0 1 0 
[3,] 1 0 0 0 
[4,] 0 1 0 0 

그러나 실제 배열의 크기는 약입니다.

array(0,dim=c(10000,12) 

따라서 루프 대신 적용하는 것이 더 좋았습니다. 나는이 사이트와 다른 곳곳을 둘러 보았고 여러 가지 방법을 시도했지만 기능에서 사용하기 위해 적용되는 현재 행을 선택하는 방법을 배제했다. 내가 좋아하는 그 (것)들을 사용했습니다

nrow() 
rownames() 

: 비슷한 게시물이 사용 제안

stringCom = function(x){ 
    i = nrow(x) 
    ifelse(x.str[i,] %in% y.str1[i,],0,1) 
} 
apply(x.str,1,stringCom) 

을하지만 점점 계속 모든 오류입니다. 내가 시도 :

test = function(x){ 

    r = nrow(x) 
    r 
} 
apply(x.str,1,test) 

그냥 출력으로 NULL을 제공합니다. 비슷한 일은 rownames, NROW, 이름 등에서 발생합니다. 아마도 매우 간단한 답변 일 것이지만 찾을 수없는 것 같습니다.

모든 제안/도움을 주시면 대단히 감사하겠습니다.

+1

원하는 출력물이 나에게 적합하지 않습니다. 나는 무엇이 체크되고 있는지에 관해 완전히 잃어버린다. – thelatemail

+0

한 쌍의 단어 목록을 비교하여 쌍이 어떤 문자를 공유 하는지를 비교하여 공유하는 총 수, 공유하는 고유 한 문자의 총 수 및 공유 문자의 위치를 ​​알아 내야했습니다. 이 작업을 수행하는 것으로 알아낼 수있는 유일한 방법은 편지로 문자를 테스트하기 위해 여러 개의 루프를 작성하지 않고 % %에서 % b 및 % b에서 %를 두 번 수행하는 것입니다. 출력이 % x.str의 y.str %에 대한 출력 이었기 때문에 위의 출력이 잘못되었음을 알았습니다 (미안합니다). 희망이 답변하고 시간을내어 주셔서 감사합니다 도움이됩니다. –

+0

x.str/y.str의 각 행은 단어의 구성 문자를 나타냅니다. y.str 행의 각 문자 ** **가 x.str **의 해당 행에 있는지 테스트하려고합니다. – smci

답변

0

한 번에 두 가지를 반복하려면 mapply의 형식을 사용하는 것이 좋습니다. 다음은 몇 가지 샘플 입력 데이터는

x.str<-matrix(strsplit("cgbfoooimnoneede","")[[1]], ncol=4) 
y.str<-matrix(strsplit("tjbloaeeomettmns","")[[1]], ncol=4) 

다음 당신은 당신이

A = array(0,dim=dim(x.str)) 
for(i in 1:length(x.str[,1])){ 
    A[i,] = ifelse(x.str[i,] %in% y.str[i,],1,0) 
} 
A 
#  [,1] [,2] [,3] [,4] 
# [1,] 0 1 0 0 
# [2,] 0 0 0 0 
# [3,] 1 0 0 0 
# [4,] 0 0 0 1 

쓴 코드로 같은 일을 반환

t(mapply(function(a,b) a%in%b, 
    split(x.str, row(x.str)), split(y.str, row(y.str)))+0) 

# [,1] [,2] [,3] [,4] 
# 1 0 1 0 0 
# 2 0 0 0 0 
# 3 1 0 0 0 
# 4 0 0 0 1 

처럼 뭔가를 할 수 있어요 그러나 그것은 항상 사실이 아니다 그 루프에 대한 천천히. 특정 애플리케이션에 가장 적합한 것이 무엇인지 확인하려면 다양한 전략을 벤치마킹해야합니다. 가장 큰 병목은 일반적인 메모리 관리입니다. 결과에 필요한 메모리를 미리 정의하는 경우 for 루프가 더 빠를 수 있습니다.

+0

프로그래밍에 능숙하지 않고 프로그래밍에 능숙하지 않아서 고맙습니다. 그래서 mapply 등의 유사한 기능 사이의 기술적 인 차이점을 이해하기 어렵습니다. 빠른 질문은 "메모리를 미리 정의하는 것입니다. 필요한 "내가 가능한 미리 정의 된 스크립트 (예 : 배열 = (0, dim = dim (x.str)))의 시작 부분에 배열 크기를 미리 루프, 함수 등을 구현하기 전에 사용해야합니다? –

관련 문제