2017-12-29 51 views
0

다음은 R의 문자 데이터 형식이 두 열인 데이터 프레임입니다. 필자의 경우, "FB, AI, IT, GE"문자열이있는 경우 이 뒤죽박죽 된 문자열이 "a2 열"에 있는지 테스트하고 해당 "a1 열"값을 반환하십시오. 분명히 첫 번째 "a2 열"값이 위의 뒤죽박죽 된 문자열과 일치하는 것이므로 반환 할 해당 "a1"값이 필요합니다. 나는 "if-else"를 사용하는 것을 피하는 것이 좋습니다. 고마워 도와주세요.뒤죽박죽 된 문자열 일치 및 해당 열 값 반환 R

a1 = c("B1","B2","B3","B4","B5") 
a2 = c("IT,GE,FB,AI","GE,AI","FB,IT,AI","GE,IT,FB","AI") 
a12 = data.frame(a1,a2) 
a12$a1 = as.character(a12$a1) 
a12$a2 = as.character(a12$a2) 
+0

는 "FB는 AI는 IT가, GE는"정확히 일치해야합니까? 더 이상 값이 없습니까? –

+0

@RonakShah, 답장을 보내 주셔서 대단히 감사합니다. –

+0

'a12 $ a1 [sapply (strsplit (a12 $ a2, "), function (x) 모두 (strsplit (val,", [[1]] % x %))]'와 같은 것입니다. 이것은 효율적인 방법이라고 생각하지 마십시오. –

답변

0

희망이 있습니다.

#string to be matched 
match_str <- "FB,AI,IT,GE" 

idx <- sapply(strsplit(as.character(a12$a2),","), 
       function(x) setequal(unlist(strsplit(as.character(match_str),",")), unlist(x))) 
a12$a1[idx] 

출력은 다음과 같습니다

[1] "B1" 

#sample data 
> dput(a12) 
structure(list(a1 = c("B1", "B2", "B3", "B4", "B5"), a2 = c("IT,GE,FB,AI", 
"GE,AI", "FB,IT,AI", "GE,IT,FB", "AI")), .Names = c("a1", "a2" 
), row.names = c(NA, -5L), class = "data.frame") 
+0

매우 유용합니다.이 기능을 사용하지 않고도 달성 할 수 있다면 매우 감사 할 것입니다. 내 문자열이 "IT, GE, FB, AI", a12 $ a1 [a12 $ a2 == "IT, GE, FB, AI"]이면 문제가 해결됩니다. 나는 이것이 정확한 문자열이라는 것을 알고 있지만 이것과 비슷한 것이 너무 뒤죽박죽 일 수 있다면, 고마워하고 친절하게 제안한다. –

+0

위 솔루션은 벡터화 된 솔루션이며 처리 속도를 늦추지는 않습니다. 나는 당신이 당신의 문자열을''''''''''에 나누지 않고 성취 할 수 있다고 생각하지 않는다. – Prem

+0

물론 도움을 주셔서 감사합니다. 아직 해결 방법을 찾을 수 있다면 알려주세요. –