2012-11-21 5 views
2

대형 데이터 프레임 (여러 100k 행)의 문자열 열에 대한 대체를 수행하고 있으며, 긴 루틴 과정에서 여러 번해야합니다 . 이 방법을 벡터화 된 방식으로 작성하려고하지만이를 수행 할 방법을 찾을 수는 없습니다. 지금은 전 길이 루프를 사용해야하며 매번 몇 분씩 걸려서 각 행을 따로 따로 진행해야합니다.루프를 사용하지 않고 많은 데이터 프레임 행에서 문자열 바꾸기

내가 기능적으로 할 수없는 이유는 각 행 값에 대해 내가 정확히 어떻게 str_extract (또는 grepl) 명령을 참조 할 수 있어야하는지하는 것 같습니다./o 색인. (목표는 6 자리 밖으로 패드에 각 가변 길이 문자열의 주요 수치 부분을 공의를 사용하는 것입니다. 항목이 "1234XYZ"처럼 보일 수 있습니다.) 분명히

for (i in 1:nrow(df)) { 

df$A[i] <- gsub("^[[:digit:]]+", 
paste(paste(rep(0,6-nchar(str_extract(df$A[i],"^[[:digit:]]+"))), collapse=""), 
str_extract(df$A[i], "^[[:digit:]]+"), collapse=""), df$A[i]) 

} 

내가 순진로 시도한 다음,

df$A <- gsub("^[[:digit:]]+", 
paste(paste(rep(0,6-nchar(str_extract(df$A,"^[[:digit:]]+"))), collapse=""), 
str_extract(df$A, "^[[:digit:]]+"), collapse=""), df$A) 

이는 루프없이 수행 할 수 있습니다 str_extract는 DF의 각각의 레코드를 가지는 벡터를 반환하기 때문에 "벡터화 된 버전은"작동하지 않는 이유는 무엇입니까?

+2

당신이 당신의 data.frame'df'와의 약간을 포함 할 수 있습니다 작동 생각? 'dput (head (df))'. 그렇지 않으면 코드가 재생성되지 않고 우리는별로 도움이되지 않습니다. – Justin

답변

0

이 재현 데이터없이 확실히 말할 어렵다, 그러나 나는 이것이 당신

front <- str_pad(str_extract(df$A, "^[[:digit:]]+"), 6, pad="0") 
back <- str_extract(df$A, "[^0-9]+") 
df$A <- paste(front, back, sep="") 
+0

Nifty! 그건 그렇습니다. 두 가지 계시 : 모든 백 엔드와 모든 프런트 엔드를 별도의 블록으로 분리하는 것을 고려하지 않았습니다. 'str_pad'를 간과했다. 감사! (split과 pad 단계 사이에서 NA를 제거 할 필요가 있다는 것을 알았 기 때문에 실제 구현은 좀 덜 간결합니다.) – Florian

+0

여기서 clincher는 'stringr' 메소드가 모두 벡터화 된 반면,'grep' \'sub '아니다. 나는. 원래 벡터화 된 샘플에서'gsub' 대신'str_replace'를 사용하면 문제가 없습니다. ㅎ :) – Florian

관련 문제