2011-10-25 8 views
8

私はread.csvまたはread.csv2を使ってRにデータを読み込むことができます。しかし、私が遭遇した問題は、私のセパレータが1文字の代わりに複数バイトの文字列であることです。私はこれにどのように対処できますか?複数バイトの区切り文字でGNU Rにテキストファイルを読み込む方法は?

+1

あなたのマルチバイト文字列は何ですか? – jthetzel

+0

もっと一般的なread.table()とsep引数を見ると、複数バイトの文字列を使うことができると思います。 – mweylandt

+0

@myylandt 'read.table()'の 'sep'は1バイトしか受け付けません(' scan() 'と同じです)。 – jthetzel

答えて

9

例データを入力すると役立ちます。しかし、あなたは次のものをあなたのニーズに適応させることができるかもしれません。

私は、次を含む単なるテキストファイルである例のデータファイル、作成された:私は「のtest.CSV」としてそれを保存し

1sep2sep3 
1sep2sep3 
1sep2sep3 
1sep2sep3 
1sep2sep3 
1sep2sep3 
1sep2sep3 

を。分離文字は 'sep'文字列です。私はread.csv()sepのためのただ1文字を受け入れるscan()を使用すると思う。これを回避するには、次の点を考慮してください。

dat <- readLines('test.csv') 
dat <- gsub("sep", " ", dat) 
dat <- textConnection(dat) 
dat <- read.table(dat) 

readLines()だけで行を読み込みgsub単一' 'ための複数文字の別離の文字列を置換したり、あなたのデータのために便利であるものは何でも。その後、textConnection()read.data()はすべてを便利に戻します。小規模なデータセットの場合は、これが問題ありません。データが非常に大きい場合は、AWKのようなもので前処理を行い、複数文字の分離文字列を置き換えることを検討してください。上記はhttp://tolstoy.newcastle.edu.au/R/e4/help/08/04/9296.htmlです。あなたがあなたのデータにスペースがある場合

更新 、あなたのコメントについては、別の交換用セパレーターを使用しています。 test.csvの変更を検討:

1sep2 2sep3 
1sep2 2sep3 
1sep2 2sep3 
1sep2 2sep3 
1sep2 2sep3 
1sep2 2sep3 
1sep2 2sep3 

次に、以下の機能を:

readMulti <- function(x, sep, replace, as.is = T) 
{ 
    dat <- readLines(x) 
    dat <- gsub(sep, replace, dat) 
    dat <- textConnection(dat) 
    dat <- read.table(dat, sep = replace, as.is = as.is) 

    return(dat) 
} 

試してみてください。ここでは

readMulti('test.csv', sep = "sep", replace = "\t", as.is = T) 

は、あなたがタブ(\t)と、元の区切りを置き換えます。 as.isread.table()に渡され、文字列の読み込みを防止しますが、それはあなたの呼び出しです。あなたがデータ内でより複雑なホワイトスペースを持っている場合は、AWKで役立つ、または前処理read.table()quote引数を見つけるかもしれない、perlの、などcrippledlambdaのstrsplit()と同様の

何かが中程度の大きさのデータのための最も可能性が高いと等価です。パフォーマンスが問題になる場合は、両方を試して、どちらが効果的かを確認してください。

+0

read.table同じエラーメッセージが表示されます。jthetzelの提案は良いのですね。実際には、私はRの前に未処理のデータを処理するためにすでにawkを利用しています。しかし、ここでの問題は、gsubの後の新しい分離文字の中の文字にどう対処できるかです( 'をサンプルコードの値の範囲内で使用します)。 – RobinMin

+0

@RobinMin上記のアップデートごとに別の置換セパレータを試してみてください。 – jthetzel

3

この場合、textConnection(txt)をファイル名に置き換えることができますが、本質的にはstrsplitを中心にコードまたは関数を作成することができます。ここで私はあなたがヘッダ行を持っていると仮定していますが、あなたはもちろんheader引数を定義して、以下の機能に基づいて、データフレームの作成を一般与えることができます:

> read.multisep <- function(File,sep) { 
+ Lines <- readLines(File) 
+ Matrix <- do.call(rbind,strsplit(Lines,sep,fixed=TRUE)) 
+ DataFrame <- structure(data.frame(Matrix[-1,]),names=Matrix[1,]) ## assuming header is present 
+ DataFrame[] <- lapply(DataFrame,type.convert)     ## automatically convert modes 
+ DataFrame 
+ } 
> 
> example <- "a#*&b#*&c 
+ 1#*&2#*&3 
+ 4#*&5#*&6" 
> 
> read.multisep(textConnection(example),sep="#*&") 
    a b c 
1 1 2 3 
2 4 5 6 
+0

read.multisepは私のためにうまく動作します〜!ありがとう@jthetzel – RobinMin

関連する問題