使用动态前置零点调整数据集中的因子

FBE*_*FBE 0 r r-factor

我有一个大data.frame(1.9M记录,20列).其中一列是因子列,其值为不同长度的数字(不同的字符/数字,例如567839,234324324,3243211等)注意:这些是数字代码,没有实际值,也可能只是不同的字符这个例子的长度.

现在我想将因子转换为13位数因子,以便在数字位数小于13的情况下,因子得到前导零.

例:

Old factor      Length  New factor
432543532532    12      0432543532532
3285087250932   13      3285087250932
464577534       9       0000464577534
2225324324324   13      2225324324324
864235325264    12      0864235325264
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的方法,但现在我卡住了.问题在于整个数据集中因子的长度不同.

我试着用一个例子来尝试以下内容.

data.frame使用我执行代码的三个不同列创建,以识别问题.

> df.test <- as.data.frame(cbind(c("432543532532", "3285087250932", "464577534", "2225324324324", "864235325264"), c("3285087250932", "132543532532", "464577534", "2225324324324", "864235325264"), c("164577534", "3285087250932", "432543532532", "2225324324324", "864235325264")))
> df.test
             V1            V2            V3
1  432543532532 3285087250932     164577534
2 3285087250932  132543532532 3285087250932
3     464577534     464577534  432543532532
4 2225324324324 2225324324324 2225324324324
5  864235325264  864235325264  864235325264

> levels(df.test$V1) <- paste(substr("0000000000000", 0, 13 - nchar(as.character(levels(df.test$V1)))), levels(df.test$V1), sep = '')
> levels(df.test$V2) <- paste(substr("0000000000000", 0, 13 - nchar(as.character(levels(df.test$V2)))), levels(df.test$V2), sep = '')
> levels(df.test$V3) <- paste(substr("0000000000000", 0, 13 - nchar(as.character(levels(df.test$V3)))), levels(df.test$V3), sep = '')
> df.test
             V1             V2                V3
1  432543532532 03285087250932     0000164577534
2 3285087250932  0132543532532 00003285087250932
3     464577534     0464577534  0000432543532532
4 2225324324324 02225324324324 00002225324324324
5  864235325264  0864235325264  0000864235325264
Run Code Online (Sandbox Code Playgroud)

问题是代码nchar(as.character(levels(df.test$V1)))不使用向量的长度df.test$V1而只使用一个值; 因子的第一级的长度(字母表/升序).并且它在所有记录上执行必要的前一个零的数量.所以没有矢量代码!

注意:如果我单独运行'nchar'代码,它会给我一个结果所有记录长度的向量,所以我认为它应该工作...

> nchar(as.character(levels(df.test$V1)))
[1] 13 13 12  9 12
> nchar(as.character(levels(df.test$V2)))
[1] 13 14 14 10 13
> nchar(as.character(levels(df.test$V3)))
[1] 13 17 17 16 16
Run Code Online (Sandbox Code Playgroud)

为什么不nchar(as.character(levels(df.test$V1)))作为向量运算符运行?谁能告诉我如何更改我的代码,那么它会得到正确的结果吗?

提前致谢!

NB.请注意,在实际情况下,我只需要在一列上执行此调整data.frame.

Jus*_*tin 5

对于零填充,您可以使用,sprintf('%04d', 1:5)但示例中的代码必须是数字.

max.nchar <- max(nchar(levels(df.test$V1)))

sprintf(paste0('%0',max.nchar), as.numeric(levels(df$V1))[df$V1])
Run Code Online (Sandbox Code Playgroud)

也许有一个更好的办法......但是你可以用gsubsprintf:

gsub(' ', '0', sprintf('%04s', levels(factor(10:15))))
Run Code Online (Sandbox Code Playgroud)