0

私は大きなものを持っていますdata.frame(190万レコード、20列)。列の1つは、異なる長さの桁の値を持つ因数列です(異なる文字数/桁、たとえば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

さまざまなアプローチを試しましたが、今は行き詰まっています。問題は、因子の長さがデータセット全体で異なることです。

例を挙げて、次のことを試しました。

data.frame問題を特定するために、コードを実行する3つの異なる列を使用して作成します。

> 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

問題は、コードnchar(as.character(levels(df.test$V1)))がベクトルの長さではdf.test$V1なく、1つの値のみを使用することです。因子の最初のレベルの長さ(アルファベット/昇順)。そして、それはすべてのレコードで必要な先行ゼロの数を実行します。したがって、ベクトルコードはありません!

注:「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

nchar(as.character(levels(df.test$V1)))ベクトル演算子として実行されないのはなぜですか?誰かが私のコードを変更する方法を教えてもらえますか?そうすれば正しい結果が得られますか?

前もって感謝します!

NB。実際の場合、この調整を実行する必要があるのは、の1つの列だけであることに注意してくださいdata.frame

4

3 に答える 3

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])

たぶんもっと良い方法があります...しかし、次のように使用できgsubますsprintf

gsub(' ', '0', sprintf('%04s', levels(factor(10:15))))
于 2012-04-24T14:59:07.110 に答える
1
as.data.frame( lapply(df.test, sprintf, fmt="%013s"))
#---------------------    
         V1            V2            V3
1 0432543532532 3285087250932 0000164577534
2 3285087250932 0132543532532 3285087250932
3 0000464577534 0000464577534 0432543532532
4 2225324324324 2225324324324 2225324324324
5 0864235325264 0864235325264 0864235325264
于 2012-04-24T15:43:32.613 に答える
0

「 (強制の可能性がある後)substrと同じ長さで同じ属性の文字ベクトル」が返されるため、コードが機能していませんでした。xしたがってx、期待される戻り値と同じ数の要素があることを確認する必要があります

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

n <- nrow(df.test)
start <- rep(0, n)
padStrs <- rep("0000000000000", n)
for (thevar in colnames(df.test))) {
    cdiff1 <- 13 - nchar(as.character(levels(df.test[, thevar])))
    levels(df.test[, thevar]) <- paste(substr(padStrs, 0, cdiff), levels(df.test[, thevar]), sep = '')
}
于 2012-04-25T09:19:02.293 に答える