fread () с запятыми вне квадратных скобок в качестве разделителей - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь использовать 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.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вместо чтения вашего CSV-файла непосредственно с вашего частного веб-сайта с помощью fread вы можете сначала загрузить CSV, а затем:

  1. Считать строки CSV (без какого-либо специального анализа), что будет эквивалентно моему 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
0 голосов
/ 25 февраля 2019

Предложение:

Из документации:

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

Если количество столбцов меняется или нерегулярно из-за ошибок при создании файла, альтернатива, такая как readLines, позволит вамобрабатывать файл построчно - возможно, используя регулярные выражения типа gsub и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...