28

私は次のような時間形式のDBを処理しています。

HOUR ID
1  2
10 4
5  6
20 6

1文字の値にゼロを配置し、次のようにNHOURという名前の新しい列に格納します。

NHOUR HOUR ID
01 1  2
10 10 4
05 5 6
20 20 6

今まで私は次のようなものに苦労しています(私はフォーラムですでにifelseに提供されているいくつかの提案に従います):

DB$NHOUR<-with(DB,ifelse(nchar(HOUR,type="chars")==1),sprintf("%02d",HOUR),as.numeric(HOUR))

しかし、成功しませんでした!Rは常に「yes」要素が指定されていないことなどを報告します。

いつものように、どんなヒントも大歓迎です!

4

4 に答える 4

53

@joran のコメントのアドバイスに従うだけで、

DB <- data.frame(
HOUR  = c(1, 10, 5, 20),
ID  = c(2, 4, 6, 6))

NHOUR <- sprintf("%02d",DB$HOUR) # fix to 2 characters 

cbind(NHOUR, DB) # combine old and newdata 
  NHOUR HOUR ID
1    01    1  2
2    10   10  4
3    05    5  6
4    20   20  6

更新 2013-01-21 23:42:00Z以下の daroczig のパフォーマンス テストに触発され、 microbenchmarkパッケージを試したかったため、この質問を更新して、提案された 3 つの異なるソリューションを比較する独自の小さなパフォーマンス テストを行いました。このスレッド。

# install.packages(c("microbenchmark", "stringr"), dependencies = TRUE)
require(microbenchmark)
require(stringr)

SPRINTF <- function(x) sprintf("%02d", x)
FORMATC <- function(x) formatC(x, width = 2,flag = 0)
STR_PAD <- function(x) str_pad(x, width=2, side="left", pad="0")

x <- round(runif(1e5)*10)
res <- microbenchmark(SPRINTF(x), STR_PAD(x), FORMATC(x), times = 15)

## Print results:
print(res)
Unit: milliseconds
        expr       min        lq    median        uq      max
1 FORMATC(x) 623.53785 629.69005 638.78667 671.22769 679.8790
2 SPRINTF(x)  34.35783  34.81807  35.04618  35.53696  37.1622
3 STR_PAD(x) 116.54969 118.41944 118.97363 120.05729 163.9664

### Plot results:
boxplot(res)

マイクロベンチマーク結果の箱ひげ図

于 2013-01-18T23:24:30.533 に答える
18

stringrパッケージを使用するのが好きです:

DB$NHOUR <- str_pad(DB$HOUR, width=2, side="left", pad="0")
于 2013-01-19T02:13:26.593 に答える
5

代替ソリューション:

> formatC(DB$HOUR, width = 2,flag = 0)
[1] "01" "10" "05" "20"

更新:この質問を文書化するためだけに、パフォーマンスの問題について簡単なテストを実行しました

> library(microbenchmark)
> SPRINTF <- function(x) sprintf("%02d", x)
> FORMATC <- function(x) formatC(x, width = 2,flag = 0)
> x <- round(runif(1e5)*10)
> microbenchmark(SPRINTF(x), FORMATC(x), times = 10)
Unit: milliseconds
        expr       min        lq    median        uq      max
1 FORMATC(x) 688.35430 723.42458 767.06025 780.84768 878.4966
2 SPRINTF(x)  31.29167  31.96052  35.75735  40.54656 147.6805
于 2013-01-19T00:34:29.130 に答える
4

と同様にstringrstri_pad_leftstringi

library(stringi)
stri_pad_left(str=DB$HOUR, 2, pad="0")
# [1] "01" "10" "05" "20"

速度的にはほぼ同じはずです。右側と両側に同様のパディング関数があります。

于 2015-07-27T22:33:59.587 に答える