1

cSplit を使用して、列を 3 つの個別の列に分割しています。区切り文字は「 / 」

ただし、私のフィールドの 1 つに「/」セパレーターが埋め込まれています。3 行目の 3 番目の要素は、分割後も "f/j" のままであるはずでした。

次の例で試してみると、余分な (4 番目の) 列が作成されます

name <- c("abc / efg / hij", "abc / abc / hij", "efg / efg / f/j", "abd / efj / hij")
y <- c(1,1.2,3.4, 5)

dt <- data.frame(name,y)
dt
dt <- cSplit(dt,"name","/", drop=FALSE)
dt

5,000 行を超える元のデータ セットで試してみると、次のエラーが発生します。

fread のエラー (x、sep[i]、ヘッダー = FALSE):

3 列が必要ですが、行 2307 にはすべての列を処理した後のテキストが含まれています。fill=TRUE で再試行してください。別の理由として、sep='/' および/または '\n' 文字がアンバランスでエスケープされていない引用符内に埋め込まれている 1 つ以上のフィールドを区別する fread のロジックが失敗したことが考えられます。quote='' が役に立たない場合は、問題を報告して、ロジックを改善できるかどうかを確認してください。

4

2 に答える 2

1

データがベクトルと同じように構造化されている場合、対象の文字が空白文字で囲まれてnameいるという考えに基づいて、次を使用できます。/

cSplit(dt,"name"," / ", drop=FALSE)

しかし、あなたが述べたように、それは次のエラーにつながりました:

fread(x, sep[i], header = FALSE) のエラー: 'sep' は 'auto' または単一の文字でなければなりません

/その主な原因はわかりませんが、対象の文字をアンダースコア (または a 以外のもの/) に置き換えてから、アンダースコアで分割すると思います。以下は例として役立ちます。

dt$name <- gsub("([^/]+)/([^/]+)/(.*)", "\\1_\\2_\\3", dt$name)
cSplit(dt, "name", "_", drop=F)

#           name   y name_1 name_2 name_3
# 1: abc_efg_hij 1.0    abc    efg    hij
# 2: abc_abc_hij 1.2    abc    abc    hij
# 3: efg_efg_f/j 3.4    efg    efg    f/j
# 4: abd_efj_hij 5.0    abd    efj    hij

これが役立つことを願っています。

于 2017-09-03T19:04:34.467 に答える
0

設定できるはずですfixed = FALSE

cSplit(dt, "name", " / ", fixed = FALSE, drop = FALSE)
##               name   y name_1 name_2 name_3
## 1: abc / efg / hij 1.0    abc    efg    hij
## 2: abc / abc / hij 1.2    abc    abc    hij
## 3: efg / efg / f/j 3.4    efg    efg    f/j
## 4: abd / efj / hij 5.0    abd    efj    hij
于 2017-09-07T15:13:39.037 に答える