在不使用循环的情况下在许多数据帧行中替换字符串

时间:2012-11-21 16:02:09

标签: r

我正在对一个大型数据帧(几个100k行)中的一列字符串进行替换,并且在漫长的例程中我必须多次这样做。我想以矢量化的方式编写它,但无法弄清楚这样做的方法。目前我必须使用一个全长循环,每次花几分钟,分别逐步遍历每一行。

我无法在功能上执行此操作的原因似乎是,对于每个行值,我需要能够在str_extract(或grepl)命令中专门引用它。不知道怎么做没有索引。 (目标是使用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)

这可以在没有循环的情况下完成吗?

1 个答案:

答案 0 :(得分: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="")