6

私は最初にこの質問を参照しましたが、私の場合、回答は役に立ちませんでした。

各コンポーネントに数字で始まり、その後に単語 (文字) が続く要素が含まれるリストがあります。要素の先頭にある一部の数字には、1 つ以上の先行ゼロがあります。リストのごく一部を次に示します。

x <- list(el1 = c("0010 First",
                  "0200 Second",
                  "0300 Third",
                  "4000 Fourth",
                  "0 Undefined",
                  "60838 Random",
                  "903200 Haphazard"),
          el2 = c("0100 Hundredth",
                  "0200 Two hundredth",
                  "0300 Three hundredth",
                  "0040 Fortieth",
                  "0 Undefined",
                  "949848 Random",
                  "202626 Haphazard"),
          el3 = c("0010 First",
                  "0200 Second",
                  "0300 Third",
                  "0100 Hundredth",
                  "0200 Two hundredth",
                  "0300 Three hundredth",
                  "0 Undefined",
                  "60838 Random",
                  "20200 Haphazard"))

私が達成したいのは、利用可能な先行ゼロを削除し、先行ゼロで0 Undefined始まらない他のすべての要素に加えて、先頭に単一のゼロを保持することです。つまり、リストを次のようにします。

x <- list(el1 = c("10 First",
                  "200 Second",
                  "300 Third",
                  "4000 Fourth",
                  "0 Undefined",
                  "60838 Random",
                  "903200 Haphazard"),
          el2 = c("100 Hundredth",
                  "200 Two hundredth",
                  "300 Three hundredth",
                  "40 Fortieth",
                  "0 Undefined",
                  "949848 Random",
                  "202626 Haphazard"),
          el3 = c("10 First",
                  "200 Second",
                  "300 Third",
                  "100 Hundredth",
                  "200 Two hundredth",
                  "300 Three hundredth",
                  "0 Undefined",
                  "60838 Random",
                  "20200 Haphazard"))

私は何時間も成功していません。私ができる最善のことはこれです:

lapply(x, function(i) {
  ifelse(grep(pattern = "^0+[1-9]", x = i),
         gsub(pattern = "^0+", replacement = "", x = i), i)
})

ただし、先頭にゼロがあるリストコンポーネントの要素を返すだけで、残りの要素は含まれず、含まれていない要素も返されません0 Undefined

誰か助けてくれませんか?

4

1 に答える 1

7

list( )をループし、要素の先頭のゼロを置き換えるためlapply(x, ..)に使用します。文字列 ( ) の先頭から 1 つ以上のゼロに一致し、その後に正の正規表現の先読み ( ) で指定された 1 ~ 9 の数字が続き、それを に置き換えます。sublist^0+(?=[1-9])''

lapply(x, function(y) sub('^0+(?=[1-9])', '', y, perl=TRUE))

または、コメントで @hwnd が言及したように、キャプチャ グループ ie の代わりに使用できますlookahead

lapply(x, function(y) sub('^0+([1-9])', '\\1', y))

または、無名関数を使用せずに、patternおよびreplacementの引数を指定できます。sub

lapply(x, sub, pattern='^0+([1-9])', replacement='\\1')
于 2015-09-27T20:16:43.540 に答える