2016-05-18 7 views
4

私は複数の行の各列に同じ文字列を持つ2つの列を持つ長いリストを持っていました。そこで、pasteを使用して-を連結し、次にsetDTを使用して、その頻度で一意のコンカットセットを返しました。R cSplitは文字列の最初の区切り文字を使用します

今、連結を取り消したいと思います。

私が試した:

library(splitstackshape) 
d5 <- cSplit(d4, 'conc', '-', 'wide') 

は、しかし、私の2番目の列に、私は時々、文字列内の複数の-さんが持っていました。

これを回避するには、最初の-区切り文字をcSplitにのみ使用します。

例:上記cSplitを使用して

conc  freq 
A-hello  4 
A-Hi-there 5 
B-HELLO  1 

を返します:

freq conc_001 conc_002 conc_003 
    4  A  hello  NA 
    5  A  Hi  there 
    1  B  HELLO  NA 

を私は希望:

freq conc_001 conc_002 
    4  A  hello 
    5  A Hi-there 
    1  B  HELLO 
+0

"tidyr"パッケージから 'separate'を使いたいかもしれません。私は 'cSplit'を設計していないので、この種のケースを扱うのが便利です。 "tidyr"の場合、アプローチは 'separate(mydf、conc、into = c(" conc_001 "、" conc_002 ")、extra =" merge ")のようなものです。 – A5C1D2H2I1M1N2O1R2T1

+0

私は、あなたが愚かな何かをすることもできます: 'cSplit(setDT(mydf)[、conc:= sub(" - "、"%^%& "、conc)]、" conc "、"%^%& " ) ':-) – A5C1D2H2I1M1N2O1R2T1

答えて

3

subを使用して、文字列の最初の指定された区切り文字のみを変更するように制限します。その後、新しいdelimeterでcSplitを使用します。

library(splitstackshape) 
df$conc <- sub('-', ' ', df$conc) 
cSplit(df, 'conc', ' ', 'wide') 
# freq conc_1 conc_2 
#1: 4  A hello 
#2: 5  A Hi-there 
#3: 1  B HELLO 
+1

もう一度Sotosに感謝します。だから、サブは最初のものだけで、gsubはすべてのものに作用します。 –

+0

正確には.. – Sotos

2

はそうでないかもしれないようにまっすぐ進むcsplitコマンドを使用するなど、これを試してみてください関数。パフォーマンスはこの方法でかなり高速です。

#Sample Data  
s<-c("A-hello", "A-Hi-there", "B-HELLO") 
df<-data.frame(s) 

#split the data into 2 parts and assign to new columns in the dataframe. 
library(stringr) 
mat <- matrix(unlist(str_split(df$s, "-", n=2)), ncol=2, byrow=TRUE) 
dfnew<-as.data.frame(mat, stringsAsFactors = FALSE) 

行列「mat」が作成されると、元の行列に結果をバインドすることができます。

+0

これはまた、n = xを持つsubとgsubと違って、より複雑なケースを可能にします。ありがとう! –

+1

'str_split_fixed'を使って' matrix(unlist ... ')を避けることができると思います。 – Sotos

+0

Sotosのコメントによると、これは動作します:data.frame(str_split_fixed(df $ s、" - "、n = 2)))結果は所望の2列×nデータフレームである – Dave2e

関連する問題