2017-12-16 10 views
0

문자열 부분 요소 Ax를 변경 한 후, 문자열의 매우 긴 벡터에서 아래에 설명 된대로이 문자열의 중복 색인을 찾으려합니다. 고려 :문자열 목록에서 모든 복제본에 대해 "쌍별"색인을 찾습니다.

D <- data.frame(string=c("A 4 B 15 C 7","A 13 B 17 C 7","A 3 Ax 1 B 15 C 7","A 12 Ax 1 B 17 C 7","A 24 B 15 C 4","A 32 B 13 C 10","A 12 Ax 1 B 24 D 1","A 12 Ax 1 B 24 D 1","A 13 B 24 D 1")) 

# string 
"A 4 B 15 C 7" 
"A 13 B 17 C 7" 
"A 3 Ax 1 B 15 C 7" 
"A 12 Ax 1 B 17 C 7" 
"A 24 B 15 C 4" 
"A 32 B 13 C 10" 
"A 12 Ax 1 B 24 D 1" 
"A 12 Ax 1 B 24 D 1" 
"A 13 B 24 D 1" 

내가 지금의 도끼에 의해 모든을 높이고 도끼를 삭제, 그래서 중복이됩니다

l <- strsplit(as.character(D$string), ' ') 

# check which list parts contain 'Ax' 
i <- sapply(l, function(v) any(v == 'Ax')) 

# for those that contain 'Ax' increase the second number with 1 
# and remove the 'Ax 1' part 
l[i] <- lapply(l[i], function(v) { 
    v[2] <- as.character(as.numeric(v[2]) + 1); 
    v[-c(which(v == 'Ax') + 0:1)] 
})  

# check which are duplicates 
k<-data.frame(k=as.integer(duplicated(l))) 
k1<-data.frame(k=as.integer(duplicated(l,fromLast = TRUE))) 

여기 해결 : Finding isotopes of find corresponding string with two differences exactly predifined

그러나 어떻게 수를 원래 데이터 프레임의 어느 위치에서 지금 확인하십시오 D Ax 값과 해당 A 값 사이에 중복 일치가 있습니까? 다음과 같이 내 생각은 : hinds 원래 data.frame에서의 inds를 삽입하여 올바른 만약 내가 확인할 수 있습니다 D

h<-c(0,0,1,1,0,0,1,1,0) 


inds <- lapply(1:length(h[h==1 & (k==1 | k1==1)]), function(x) which(paste0(l[h==1 & (k==1 | k1==1)], collapse = NULL) %in% as.vector(l[h==1 & (k==1 | k1==1)][x]))) 

inds<-unlist(inds) 

inds: 
1 
2 
3 
3 

의 도끼 (1) 또는하지 (0)의 행이 있는지 여부를 나타내는 경우 : 첫 번째 열은 값 및 해당 제 도끼 값이 또한

하지만을 갖는다

X<-data.frame(A=A[h==0 & (k==1 | k1==1),1][inds],Ax=A[h==1 & (k==1 | k1==1),1]) 

시간이 많이 걸리는 것이없는 것 항상 정확한 색인을 제공하고 inds에 둘 이상의 일치 항목이있는 경우 더 이상 작동하지 않습니다.

누구나 개선하고/수정하고 여러 경기를 처리하는 방법을 알고 있습니까? 결국 inds 벡터 (또는 행에 여러 개의 일치하는 경우 목록으로), 그래서 내가 알고있는 (있는 경우 중복) 어떤 위치에서 내 A 문자열은 원래 데이터에있는 Ax 상대로 있습니다. 프레임 D. A 문자열과 해당 Ax 문자열의 각 색인을 찾는 다른 방법도 환영합니다.

누군가 나를 도와 줄 수 있습니까?

고마워요.

답변

0

문제를 해결하는 데 오래 비효율적입니다 (쉽게 개선 할 수 있음).

D%>% 
mutate(string = as.character(string),spaces = str_count(. ,' ')+1)%>% 
magrittr::set_colnames(c("strings", "spaces"))%>% 
separate(col = strings, into = paste("col", 1:max(.$spaces), sep = ""))%>% 
mutate(col2 = as.numeric(col2), col4 = as.numeric(col4))%>% 
mutate(col2 = ifelse(col4 == 1 & col3 == "Ax", col2+col4, col2), 
     col4 = ifelse(col3 == "Ax", "", col4))%>% 
mutate_all(funs(replace(., is.na(.)|. == "Ax", NA)))%>% 
select(-spaces)%>% 
unite(col = "D",colnames(.), sep = " ")%>% 
mutate(D = gsub(" NA |NA", "", D)) 

       D 
1 A 4 B 15 C 7 
2 A 13 B 17 C 7 
3 A 4 B 15 C 7 
4 A 13 B 17 C 7 
5 A 24 B 15 C 4 
6 A 32 B 13 C 10 
7 A 13 B 24 D 1 
8 A 13 B 24 D 1 
9 A 13 B 24 D 1 

는 단지 사용하여 인덱스를 얻을 수 which() 다음 TRUE/FALSE 값의 벡터를 반환 duplicate()를 사용하여 '중복'문자열 문제의 인덱스를 효율적으로 활용하려면 다음

data%>% 
duplicated()%>% 
which() 

이 따라서, 귀하의 중복 데이터가 다음을 통해 표시됩니다 : 나는 과정을 알고

D%>% 
mutate(string = as.character(string),spaces = str_count(. ,' ')+1)%>% 
magrittr::set_colnames(c("strings", "spaces"))%>% 
separate(col = strings, into = paste("col", 1:max(.$spaces), sep = ""))%>% 
mutate(col2 = as.numeric(col2), col4 = as.numeric(col4))%>% 
mutate(col2 = ifelse(col4 == 1 & col3 == "Ax", col2+col4, col2), 
     col4 = ifelse(col3 == "Ax", "", col4))%>% 
mutate_all(funs(replace(., is.na(.)|. == "Ax", NA)))%>% 
select(-spaces)%>% 
unite(col = "D",colnames(.), sep = " ")%>% 
mutate(D = gsub(" NA |NA", "", D))%>% 
duplicated()%>% 
which() 

[1] 3 4 8 9 

오히려 cumbe를 찾습니다 rsome, 나중에 그것을 압축 할 수 있는지 알 겠어.

+0

답장을 보내 주셔서 감사합니다. 그러나 이것이 이것을 올바르게 이해함에 따라, 결국 이것은 값이 중복되지만 중복 쌍의 인덱스가 아닌 인덱스 만 제공합니다. A가 도끼를 가지고있는 곳?! – JmO

+0

"중복 쌍의 색인" 이 모양의 결과는 무엇입니까? 이렇게? '[1] 3 4 7 8' – InfiniteFlashChess

+0

다음과 같이 : "A 3 Ax 1 B 15 C 7"1 때문에 "A 4 B 15 C 7"; "A 13 B 17 C 7", "A 12 Ax 1 B 24 D 1"및 "A 12 Ax 1 B 24 D 1"3이기 때문에 "A 12 A 1 B 17 C 7" 1 "그래서 내 질문에 내 inds 벡터처럼 1 2 3 3. – JmO