2

大きな csv データファイル (, で区切られている) を読み込もうとしていますが、次のような行でスタックし続けます: 生ファイルへのリンク: " http://daniels-pull.universityofdenv.netdna-cdn.com /assets/GeneralOccurrencesAll.csv "

| RIN    | UCR_Group | Loc                                         |
|--------|-----------|---------------------------------------------|
|490658  | Property  | 400 BLOCK 17TH ST, 5TH FL                   |
|506928  | Disorder  | 1400 BLOCK W COLORADO AVE, COLORADO SPRINGS |

ご覧のとおり、ファイルの区切り文字も列で使用されています。列の区切り文字を正規表現として指定してファイルを読み取る方法はありますか、または read.fwf を使用して各フィールドの最大長を調べ、それを使用してデータを解析する必要がありますか? 現在、これは私がこれまでに思いついた私のコードです:

datafile <- "http://daniels-pull.universityofdenv.netdna-cdn.com/assets/GeneralOccurrencesAll.csv"
new <-readr::read_delim(datafile, sep ='[\\S],[\\S]')  
new <-read.table(datafile, sep ='[\\S],[\\S]' )

read.fwf を使用する必要がありますか、それとも問題のある列を手動で引き出す必要がありますか? どんな助けでも大歓迎です。

編集:

ボーナス ポイントについては、csv ファイル内の不適切な列や、この場合のようにファイルの構造を台無しにする可能性のあるデータを検出する関数を構築したいと考えています。そうすれば、テキスト エディターをいじる必要がなくなり、ファイル内のこれらのエラーをプログラムで見つけることができます。このようなものを構築する方法について考えていますか?

4

4 に答える 4

2

スペース以外で囲まれた各カンマをセミコロンに置き換えてから、 を使用して結果を読み取りますread.csv2

(から読み取るコマンドにLines置き換えます。また、ファイルにセミコロンがある場合は、別の文字を使用して、 への引数または単に、および への 2 番目の引数で指定します。)readLines(u)usep=read.csv2read.csvgsub

read.csv2(text = gsub(",(\\S)", ";\\1", Lines)))

与える:

     RIN UCR_Group                                         Loc
1 490658  Property                   400 BLOCK 17TH ST, 5TH FL
2 506928  Disorder 1400 BLOCK W COLORADO AVE, COLORADO SPRINGS

注:これを入力として使用しましたLines

Lines <- c("RIN,UCR_Group,Loc", 
  "490658,Property,400 BLOCK 17TH ST, 5TH FL", 
  "506928,Disorder,1400 BLOCK W COLORADO AVE, COLORADO SPRINGS")

更新:実際のファイルでは、有効なコンマ区切り記号の前にスペースが表示される可能性があり、1 つの文字フィールドがあるため、それに応じてパターンを変更しました。ファイルの最初の 3 行の結果は次のとおりです。

u <- "http://daniels-pull.universityofdenv.netdna-cdn.com/assets/GeneralOccurrencesAll.csv"
Lines <- readLines(u, 3)

read.csv2(text = gsub(",(\\S)", ";\\1", Lines))

与える:

     RIN               UCR_Group                            UCR_Cat
1 416667 Crimes Against Property Criminal Mischief/Damaged Property
2 416673  Crimes Against Persons              Forcible Sex Offenses
              EXP_TRANSLATION         OCC_DATE OCC_TIME                     LOC
1 CRIMINAL MISCHIEF - MTR VEH 1/1/2010 0:00:00      145  200 BLOCK S ZENOBIA ST
2             SEX ASLT - RAPE 1/1/2010 0:00:00      300 1500 BLOCK S DECATUR ST
  TRANSLATION       PIN               DOB SEX          X          Y     LON
1 VICTIM      235602181  5/6/1979 0:00:00   M 3126041.08 1684996.73 -105.05
2 ARRESTEE    219220590 3/19/1988 0:00:00   M 3134340.56 1676360.06 -105.02
    LAT
1 39.71
2 39.68
于 2017-01-09T13:50:38.043 に答える
1

エスケープされていないコンマがあるフィールドは次のとおりです。

library(stringi)
library(purrr)

txt <- readr::read_lines("http://daniels-pull.universityofdenv.netdna-cdn.com/assets/GeneralOccurrencesAll.csv")
commas <- stri_locate_all_fixed(txt, ",")

map2_chr(txt[1:100], commas[1:100], function(x, y) {
  len <- nrow(y)
  bits <- c(1:6, (len-6):len)
  for (i in bits) { stri_sub(x, y[i,1], y[i,2]) <- ";" }
  x
}) -> rd

read.table(text=rd, header=TRUE, sep=";", stringsAsFactors=FALSE) %>%
  dplyr::glimpse()
## Observations: 99
## Variables: 14
## $ RIN             <int> 416667, 416673, 416674, 416680, 416684, 416686...
## $ UCR_Group       <chr> "Crimes Against Property", "Crimes Against Per...
## $ UCR_Cat         <chr> "Criminal Mischief/Damaged Property", "Forcibl...
## $ EXP_TRANSLATION <chr> "CRIMINAL MISCHIEF - MTR VEH", "SEX ASLT - RAP...
## $ OCC_DATE        <chr> "1/1/2010 0:00:00", "1/1/2010 0:00:00", "1/1/2...
## $ OCC_TIME        <int> 145, 300, 500, 730, 200, 440, 100, 851, 140, 2...
## $ LOC.TRANSLATION <chr> "200 BLOCK S ZENOBIA ST,VICTIM     ", "1500 BL...
## $ PIN             <int> 235602181, 219220590, 119013720, 174326399, 32...
## $ DOB             <chr> "5/6/1979 0:00:00", "3/19/1988 0:00:00", "5/25...
## $ SEX             <chr> "M", "M", "M", "M", "F", "F", "F", "F", "F", "...
## $ X               <dbl> 3126041, 3134341, 3134360, 3127695, 3193317, 3...
## $ Y               <dbl> 1684997, 1676360, 1700160, 1682545, 1708673, 1...
## $ LON             <dbl> -105.05, -105.02, -105.02, -105.04, -104.81, -...
## $ LAT             <dbl> 39.71, 39.68, 39.75, 39.70, 39.77, 39.78, 39.7...
于 2017-01-09T12:49:11.180 に答える
0

アドレスのコンマにスペースがあるという事実に基づいて、正規表現を使用してこのファイルを解析できることを示す実際の例を次に示します。もちろん、このルールが常に成り立つとは限らない場合、これはさらに複雑になります。

txt <- "RIN,UCR_Group,Loc
123456,Property,1 STREET
490658,Property,400 BLOCK 17TH ST, 5TH FL
506928,Disorder,1400 BLOCK W COLORADO AVE, COLORADO SPRINGS"

dat <- readLines(textConnection(txt))
# in a real example:
# dat <- readLines("filename.csv")

spl <- strsplit(dat, "(?<=\\S),(?=\\S)", perl=TRUE)
setNames(data.frame(do.call(rbind, spl[-1])), spl[[1]])

#     RIN UCR_Group                                         Loc
#1 123456  Property                                    1 STREET
#2 490658  Property                   400 BLOCK 17TH ST, 5TH FL
#3 506928  Disorder 1400 BLOCK W COLORADO AVE, COLORADO SPRINGS
于 2017-01-09T04:24:48.273 に答える