2012-11-21 22 views
2

我正在做一個大數據框(幾個100k行)中的字符串列的替換,而且我必須在冗長的例程。我想用矢量化的方式寫這個,但是不能找出一個方法去做。目前,我必須使用全長循環,每次花費幾分鐘時間,分別逐行瀏覽每一行。在許多數據幀行中替換字符串而不使用循環

我不能在功能上做到這一點的原因似乎是,對於每一行值,我需要能夠在str_extract(或grepl)命令中明確引用它,但我不知道如何執行w/o索引。 (目的是使用0以墊的每個可變長度字符串的前導數字部分出到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]) 

} 

顯然下文中,我天真地試圖作爲在「矢量版」,不能因爲str_extract返回一個向量與DF的每一行的條目:

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

可以這樣沒有環辦?

+2

您可以包括一個小的data.frame'df'的工作嗎? 'dput(頭(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

漂亮!這就是它。兩個啓示:沒有想到將所有後端和所有前端拆分成單獨的塊;並忽略了'str_pad'。謝謝! (實際的實現不太緊湊,因爲我發現我需要在拆分步驟和填充步驟之間刪除NDA)。 – Florian

+0

我剛剛意識到這裏的重點在於'stringr'方法都是矢量化的,而'grep' \ sub '不是。即在原始矢量化樣本中使用'str_replace'而不是'gsub'可以正常工作。嘿:) – Florian

相關問題