5

最初の 2 つのコロンで文字列の列を分割したいのですが、後続のコロンでは分割したくありません。

my.data <- read.table(text='

my.string    some.data
123:34:56:78   -100
87:65:43:21    -200
a4:b6:c8888    -300
11:bbbb:ccccc  -400
uu:vv:ww:xx    -500', header = TRUE)

desired.result <- read.table(text='

my.string1  my.string2  my.string3  some.data
123         34          56:78         -100
87          65          43:21         -200
a4          b6          c8888         -300
11          bbbb        ccccc         -400
uu          vv          ww:xx         -500', header = TRUE)

私は広範囲に検索しましたが、次の質問が私の現在のジレンマに最も近いものです。

文字列の最初のカンマで分割

ご提案ありがとうございます。ベースRを使用することを好みます。

編集:

最初のコロンの前の文字数は常に 2 ではなく、最初の 2 つのコロンの間の文字数は常に 2 ではありません。そのため、これを反映するように例を編集しました。

4

5 に答える 5

4

パッケージの使用stringr:

str_match(my.data$my.string, "(.+?):(.+?):(.*)")

     [,1]            [,2]  [,3]   [,4]   
[1,] "123:34:56:78"  "123" "34"   "56:78"
[2,] "87:65:43:21"   "87"  "65"   "43:21"
[3,] "a4:b6:c8888"   "a4"  "b6"   "c8888"
[4,] "11:bbbb:ccccc" "11"  "bbbb" "ccccc"
[5,] "uu:vv:ww:xx"   "uu"  "vv"   "ww:xx"

更新: 最新の例 (上記) と Hadley のコメント ソリューション:

str_split_fixed(my.data$my.string, ":", 3)
     [,1]  [,2]   [,3]   
[1,] "123" "34"   "56:78"
[2,] "87"  "65"   "43:21"
[3,] "a4"  "b6"   "c8888"
[4,] "11"  "bbbb" "ccccc"
[5,] "uu"  "vv"   "ww:xx"
于 2013-11-03T03:59:08.003 に答える
1

私はゲームに少し遅れています。そして、私の解決策は、以前の回答と多くの重複があります。それにもかかわらず、それは誰かに役立つかもしれません:

# Replace first two colons with commas.
new.string = gsub(pattern="(^[^:]+):([^:]+):(.+$)",
                  replacement="\\1,\\2,\\3",
                  x=my.data$my.string)

# Split on commas, producing a list.
split.data = strsplit(new.string, ",")

# Change list into matrix, then data.frame.
new.data = data.frame(do.call(rbind, split.data))
names(new.data) = paste("my.string", seq(ncol(new.data)), sep="")

my.data$my.string = NULL
my.data = cbind(new.data, my.data)
my.data

#   my.string1 my.string2 my.string3 some.data
# 1        123         34      56:78      -100
# 2         87         65      43:21      -200
# 3         a4         b6      c8888      -300
# 4         11       bbbb      ccccc      -400
# 5         uu         vv      ww:xx      -500

@topchef で指摘されているように、コンマ (またはその他の文字) がデータに含まれていないことを保証する必要があります。

また、各文字列には少なくとも 2 つのコロンが存在する必要があります。存在しない場合、パターンは何にも一致しないため、分割は発生しません。

于 2013-11-03T05:26:03.300 に答える
0

最初のコロンで strsplit(sub(":\s*", XX, x), XX) (他の質問へのリンクにリストされている例のように)、後半を取り、最初のコロンで分割できませんでしたかまたコロン?

于 2013-11-03T03:49:26.107 に答える