ここで従うのはかなり簡単なはず「tidyr」からextract
を使用する一つの方法です。
まず、データを読み込み、最初の数行と最後の数行を調べます。検査の後、我々はデータ値がラインから3抽出段階で22384.
x <- readLines("http://eve-files.com/chribba/typeid.txt")
# Check out the data
head(x) # Let's get rid of the first two lines...
tail(x) # ... and the last 3
にあることがわかり、私たちは基本的に探している:
- 数の集合 - 可能であること様々な長さ(
([0-9]+)
)。それは()
にあるので、それをキャプチャして新しい列に抽出します。
- 数字の後に2つ以上のスペース(
[ ]{2,}
)を続けてください。それは()
にはないので、新しい列にそれを抽出する必要はありません。
- 空白のセットの後ろに他のもの(
(.*)
)を付けることができます。これは()
にあるので、それをキャプチャして新しい列に抽出します。
"x"の最初の値を使用して元の列名を抽出しました。ここで
が、それは次のようになります。
library(tidyverse)
data_frame(V1 = x[3:(length(x)-3)]) %>%
extract(V1, into = scan(text = x[1], what = ""), regex = "([0-9]+)[ ]{2,}(.*)")
# # A tibble: 22,382 x 2
# typeID typeName
# * <chr> <chr>
# 1 0 #System
# 2 2 Corporation
# 3 3 Region
# 4 4 Constellation
# 5 5 Solar System
# 6 6 Sun G5 (Yellow)
# 7 7 Sun K7 (Orange)
# 8 8 Sun K5 (Red Giant)
# 9 9 Sun B0 (Blue)
# 10 10 Sun F0 (White)
# # ... with 22,372 more rows
それとも
data_frame(V1 = x[3:(length(x)-3)]) %>%
separate(V1, into = scan(text = x[1], what = ""), sep = "[ ]{2,}",
extra = "merge", convert = TRUE)
別のアプローチは、分割値として[ ]{2, }
とstrsplit
を使用するのが良いかもしれません。それに続くのは、do.call(rbind, ...)
ですが、スプリットで2つの値が生じた場合にのみフィルタリングしたい場合があります。
do.call(rbind, Filter(function(z) length(z) == 2, strsplit(x, "[ ]{2, }")))
それは一定の幅ではなくdelimtedだよりのように見えます。 "iotools"または "readr"パッケージを見てください。また、あなたがそれを考慮しなければ、 '#'は問題になります。 – A5C1D2H2I1M1N2O1R2T1
または単に 'read.fwf'をベースにします。 – Gregor