2017-12-21 34 views
2

3 열을 포함하고 15565 개의 관측치를 가진 데이터 세트가 있습니다. 한 열에는 같은 행에 여러 단어가 있습니다. 내가 할 일은 각 행의 특정 단어를 추출하여 새 열에 추가하는 것입니다. (전체적으로 4 열을 갖게됩니다) 문제는 내가 찾고있는 단어가 동일하지 않다는 것입니다. 항상 같은 위치에있는 것은 아닙니다.n 행에서 문자열에서 단어를 추출하고 R에서 새 열로 그 단어를 보냅니다.

x y z 1 T 3C00652722 (T558799A) 2 T NA >> MSP: T0578836A & 3C03024632 3 T T0579010A, 3C03051500, EAET03051496 4 U T0023231A > MSP: T0577506A & 3C02808556 8 U (T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502

내가 3C로 시작하고 10 자있는 모든 단어를 추출한 다음은 다음과 같습니다 있도록 새로운 COL로를 추가 찾고 있어요 : 여기 내 DS의 추출물

x y z R
1 T 3C00652722 (T558799A) 3C00652722 2 T NA >> MSP: T0578836A & 3C03024632 3C03024632 3 T T0579010A, 3C03051500, EAET03051496 3C03051500 4 U T0023231A > MSP: T0577506A & 3C02808556 3C02808556 8 U >POPMigr.T576447A,C72/221816*3C00721502 3C00721502

난 아무 소용로 stringr의 gprep 라이브러리를 사용하여 시도했다.

답변

5

우리는 단지 위해 내가 stringr 라이브러리와 substring 방법에 따라 다른 솔루션을 게시하고, akrun's 솔루션은 간단하고 우아한 방법입니다 str_extract

library(stringr) 
df1$R <- str_extract(df1$z, "\\b3C[^, ]{8}") 
df1$R 
#[1] "3C00652722" "3C03024632" "3C03051500" "3C02808556" "3C00721502" 
+3

입니다 그리고 나는이 잘 입력이 패턴과 일치하지 않을 수 있습니다 경우를 처리하지 않는, gsub''사용하는 것이 바람직하다 생각합니다. 'str_extract'는 'NA'를 반환합니다. 이것은 일치하지 않는 +1에 대한 알맞은 자리 표시 자입니다. –

+0

@akrun 당신은 신 친구입니다! 정말 감사합니다! 나는이 일을하려고 지난 24 시간 동안 내 머리를 두드려왔다! –

+1

@RaulGonzales 도움이되었음을 기쁜 마음으로 알아보십시오. 나는 평범한 사람이 프로그래밍에 열정적 인 상식을 통해 항상 ... – akrun

2

동안이 작업을 수행 할 수 있습니다.

library(stringr) 

x <- c(1,2,3,4,8) 
y <- c('T','T','T','U','U') 
z <- c('3C00652722 (T558799A)', 'NA >> MSP: T0578836A & 3C03024632', 'T0579010A, 3C03051500, EAET03051496', 
    'T0023231A > MSP: T0577506A & 3C02808556', '(T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502') 

dt <- data.frame(x,y,z) 

charLoc <- str_locate(pattern = "3C", dt$z) 
idx <- list() 
for (s in 1:dim(charLoc)[1]) { 
    idx[s] <- substring(dt$z[s], first = charLoc[s,][1], last = charLoc[s,][1]+9) 
} 
dt$val <- sapply(idx, paste0, collapse=",") 
print(head(dt)) 

와 같은의 출력은

x y               z  val 
1 1 T          3C00652722 (T558799A) 3C00652722 
2 2 T       NA >> MSP: T0578836A & 3C03024632 3C03024632 
3 3 T       T0579010A, 3C03051500, EAET03051496 3C03051500 
4 4 U      T0023231A > MSP: T0577506A & 3C02808556 3C02808556 
5 8 U (T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502 3C00721502