1

我正在尝试使用fread()从网站获取一些数据。使用逗号分隔符方便地设置数据,但我收到错误:

1: In fread("https://website.com/") :
Stopped early on line 56. Expected 5 fields but found 6. Consider fill=TRUE and comment.char=. First discarded non-empty line: <<0,1,1,x[[0], [1]],0>>

这是因为第 56 行之前的条目在第 4 列有一个空白,所以类似于<<1,1,1,0>>,而第 56 行在第 4 列有一个包含逗号的内容,所以它将它分成两列。现在,我希望将整体x[[y], [z]]放在一个单元格中,所以我希望我的数据用逗号分隔,但当逗号在方括号内时则不然。

编辑:真正的网站是私有的,所以在这里链接它是没有意义的,但它只包含 csv 格式的数据。就像是:

field1,field2,field3,field4,field5
1,0,0,,1
0,0,0,,1
1,1,0,,1
1,1,0,,1
............
0,1,1,x[[0], [1]],0
0,1,0,x[[0], [1]],1
1,0,1,,1
0,0,1,x[[1], [0]],0
............

问题在于x[[0], [1]]应该全部在一个单元格中,但由于逗号分隔符,它被分成两个单元格。

有什么方法可以使用fread()?或使用任何其他类似目的的功能来做到这一点?

提前谢谢你,如果问题有点基本,我很抱歉,我刚刚开始使用 R。

4

2 回答 2

1

fread您可以先下载 CSV,然后再下载 CSV,而不是直接从您的私人网站读取 CSV 文件:

  1. 读取 CSV 的行(无需任何特殊解析),这将等同于 my csv_lines <- read_lines(my_weird_csv_text);
  2. 然后,根据正则表达式拆分这些读取的行,"(?!\\])(\\,)(?!\\s\\[)"而不是使用单个逗号","(这样可以确保这些表达式中的逗号"[["不用"]]"作拆分字符);
  3. split_lines最后,从结果矩阵split_lines

我希望这很清楚。

fread基本上,我们必须通过逐行读取然后基于处理您的特殊情况的正则表达式进行拆分来规避直接读取功能,例如或其他等效功能。

library(readr)
library(data.table)
library(stringr)
library(tibble)

my_weird_csv_text <- 
"field1,field2,field3,field4,field5
1,0,0,,1
0,0,0,,1
1,1,0,,1
1,1,0,,1
0,1,1,x[[0], [1]],0
0,1,0,x[[0], [1]],1
1,0,1,,1
0,0,1,x[[1], [0]],0"

csv_lines <- read_lines(my_weird_csv_text)

split_lines <- stringr::str_split(csv_lines, "(?!\\])(\\,)(?!\\s\\[)", simplify = TRUE)

as_tibble(split_lines[-1, ]) %>%
  `colnames<-`(split_lines[1, ]) -> tbl

tbl
#> # A tibble: 8 x 5
#>   field1 field2 field3 field4      field5
#>   <chr>  <chr>  <chr>  <chr>       <chr> 
#> 1 1      0      0      ""          1     
#> 2 0      0      0      ""          1     
#> 3 1      1      0      ""          1     
#> 4 1      1      0      ""          1     
#> 5 0      1      1      x[[0], [1]] 0     
#> 6 0      1      0      x[[0], [1]] 1     
#> 7 1      0      1      ""          1     
#> 8 0      0      1      x[[1], [0]] 0
于 2019-02-25T21:15:44.700 回答
1

一条建议:

从文档中:

'fread' is for regular delimited files; i.e., where every row has the same number of
columns.

如果由于文件生成错误而导致列数变化或不规则,则可以使用类似的替代readLines方法逐行处理文件-也许使用正则表达式等gsub

于 2019-02-25T16:18:50.880 回答