2

csvファイルからデータを読み取っていますが、データの列の1つが3つの異なる形式で提供されています。

xxxxx-xxx-xx (5-3-2)
xxxxx-xxxx-x (5-4-1)
xxxx-xxxx-xx (4-4-2)

私の目標は、これら3つの異なるスタイルを次の形式で1つのスタイルに変換することです。xxxxx-xxxx-xx(5-4-2)

すべての異なるフォームを同じにするために、次のような3つの異なる条件のそれぞれの特定の場所に追加のゼロを挿入する必要があります。

xxxxx-0xxx-xx
xxxxx-xxxx-0x
0xxxx-xxxx-xx

誰かがこれを達成するための最良の方法について考えていますか?

4

4 に答える 4

8

と を使用してこれをsprintf行いstrsplitます:

x <- c('11111-111-11', '11111-1111-1', '1111-1111-11')
y <- strsplit(x, '-')
myfun <- function(y) {
  first <- sprintf('%05d', as.integer(y[1]))
  second <- sprintf('%04d', as.integer(y[2]))
  third <- sprintf('%02d', as.integer(y[3]))

  paste(first, second, third, sep='-')
}

sapply(y, myfun)
# [1] "11111-0111-11" "11111-1111-01" "01111-1111-11"

手の込んだ正規表現やgsubfnパッケージを使ってこれを行うこともできますが、それはやり過ぎかもしれません!

于 2013-03-01T21:28:06.560 に答える
5

ジャスティンのソリューションのわずかに短く、より機能的なプログラミング バージョン

numbers <- c('11111-111-11', '11111-1111-1', '1111-1111-11')
restyle <- function(number, fmt){
  tmp <- as.list(as.integer(strsplit(number, '-')[[1]]))
  do.call(sprintf, modifyList(tmp, list(fmt = fmt)))
}

sapply(numbers, restyle, fmt = '%05d-%04d-%02d', USE.NAMES = F)
于 2013-03-01T21:56:38.070 に答える
3

UNIX ライクな環境で作業していますか? R の正規表現関数よりも、コマンド ラインで sed を使用する方が簡単かもしれません。

echo "54324-965-23" | sed 's/\(.....\)-\(...\)-\(..\)/\1-0\2-\3/'

吐き返します

54324-0965-23

ファイル全体に適用する場合は、次のようになります

cat file1.txt | sed 's/\(.....\)-\(...\)-\(..\)/\1-0\2-\3/' > file2.txt

また、複数のtxt変更操作がある場合は、それらをすべて一緒にパイプできます

cat file1.txt | sed 's/\(.....\)-\(...\)-\(..\)/\1-0\2-\3/' | sed '2ndthing' | sed 'thirdthing' > file2.txt
于 2013-03-01T21:39:01.707 に答える
0

これに対する 1 つの解決策は、最初にハイフンを削除してから、目的の文字位置にハイフンを追加することです。次のようにします。

> v <- c("01234-567-89","01234-5678-9","0123-4567-89")
> v
[1] "01234-567-89" "01234-5678-9" "0123-4567-89"
> #remove hyphens
> v <- gsub("-","",v)
> v
[1] "0123456789" "0123456789" "0123456789"
> #add hyphens
> paste(substr(v,1,4),substr(v,5,8),substr(v,9,10),sep="-")
[1] "0123-4567-89" "0123-4567-89" "0123-4567-89"
于 2013-03-01T21:26:18.527 に答える