Как прочитать строку символов в столбце набора данных

Я не знаю, как использовать команду read.table, когда данные, которые я хочу прочитать, имеют несколько столбцов со строками символов.

У меня есть файл .dat, содержащий 28 столбцов и 100 строк.

  Año  Mes  Día Hora  Min      SO2      NOx       CO       O3     PM10    PM2.5     VelV     DirV     Temp   SO2_MH   NOx_MH    CO_MH    O3_MH  PM10_MH PM2.5_MH   Pred_SO2   Pred_NOx     PredBin_SO2     PredBin_NOx  CodM_SO2  CodM_NOx          Mensaje_SO2          Mensaje_NOx
 2018    5   15   16   38    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    99.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00      -1.00      -1.00           -1.00           -1.00         0         0                                          
 2018    5   15   16   39    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    99.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00      -1.00      -1.00           -1.00           -1.00         0         0                                          
 2018    5   16   11   29     4.15     7.51     0.33    77.00    13.00     5.00     1.13   259.00    14.50     4.15     7.51     0.33    77.00    13.00     5.00       4.15       7.51            0.03            0.00         1         1        No hay alarma        No hay alarma
 2018    5   16   11   30     4.15     7.51     0.33    77.00    13.00     5.00     1.13   259.00    14.50     4.15     7.51     0.33    77.00    13.00     5.00       4.15       7.51            0.03            0.00         1         1        No hay alarma        No hay alarma                         

Когда я пытаюсь прочитать данные, первые 26 столбцов читаются нормально, но 27-й и 28-й — «Нет» и «сена», поэтому я хочу прочитать полное предложение в 27-м столбце и сделать то же самое в 28-м. .

Это то, что я использую

min <- read.table("min.dat",header=T, fill = TRUE)

Но я полагаю, что мне нужно как-то использовать параметр цитаты... (Я использую fill=TRUE, потому что некоторые из этих строк символов пусты).

Можете ли вы отредактировать свой пост, чтобы показать первые несколько строк вашего файла?

Rohit 21.05.2019 11:20

Есть ли в файле разделитель столбцов? Может быть, символ табуляции "\t".

Rui Barradas 21.05.2019 11:20

@Rohit Да, извините, что не сделал этого раньше, теперь я думаю, что это более понятно.

Rai 21.05.2019 12:37
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
3
438
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это, используя readr::read_fwf(), если вы можете указать начальную и конечную позиции каждого столбца:


library(readr)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
fname <- 'sample.txt'
write_file(
  '  Año  Mes  Día Hora  Min      SO2      NOx       CO       O3     PM10    PM2.5     VelV     DirV     Temp   SO2_MH   NOx_MH    CO_MH    O3_MH  PM10_MH PM2.5_MH   Pred_SO2   Pred_NOx     PredBin_SO2     PredBin_NOx  CodM_SO2  CodM_NOx          Mensaje_SO2          Mensaje_NOx
 2018    5   15   16   38    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    99.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00      -1.00      -1.00           -1.00           -1.00         0         0                                          
 2018    5   15   16   39    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00    99.00    -1.00    -1.00    -1.00    -1.00    -1.00    -1.00      -1.00      -1.00           -1.00           -1.00         0         0                                          
 2018    5   16   11   29     4.15     7.51     0.33    77.00    13.00     5.00     1.13   259.00    14.50     4.15     7.51     0.33    77.00    13.00     5.00       4.15       7.51            0.03            0.00         1         1        No hay alarma        No hay alarma
 2018    5   16   11   30     4.15     7.51     0.33    77.00    13.00     5.00     1.13   259.00    14.50     4.15     7.51     0.33    77.00    13.00     5.00       4.15       7.51            0.03            0.00         1         1        No hay alarma        No hay alarma                         ',
  fname
)

hdr <- read_lines(fname,n_max = 1)
cnames <- hdr %>%
  trimws()%>%
  strsplit('\\s+')%>%
  unlist()

m <- gregexpr('\\S(?=\\s|$)',hdr,perl = T) # Find end position of columns
epos <-unlist(m)
spos <- lag(epos+1,1,default = 1)

read_fwf(fname,fwf_positions(start = spos,end = epos,col_names = cnames),skip = 1)
#> Parsed with column specification:
#> cols(
#>   .default = col_double(),
#>   Mensaje_SO2 = col_character(),
#>   Mensaje_NOx = col_character()
#> )
#> See spec(...) for full column specifications.
#> # A tibble: 4 x 28
#>     Año   Mes   Día  Hora   Min   SO2   NOx    CO    O3  PM10 PM2.5  VelV
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  2018     5    15    16    38 -1    -1    -1       -1    -1    -1 -1   
#> 2  2018     5    15    16    39 -1    -1    -1       -1    -1    -1 -1   
#> 3  2018     5    16    11    29  4.15  7.51  0.33    77    13     5  1.13
#> 4  2018     5    16    11    30  4.15  7.51  0.33    77    13     5  1.13
#> # … with 16 more variables: DirV <dbl>, Temp <dbl>, SO2_MH <dbl>,
#> #   NOx_MH <dbl>, CO_MH <dbl>, O3_MH <dbl>, PM10_MH <dbl>, PM2.5_MH <dbl>,
#> #   Pred_SO2 <dbl>, Pred_NOx <dbl>, PredBin_SO2 <dbl>, PredBin_NOx <dbl>,
#> #   CodM_SO2 <dbl>, CodM_NOx <dbl>, Mensaje_SO2 <chr>, Mensaje_NOx <chr>

Created on 2019-05-21 by the reprex package (v0.3.0)

Я получаю 28 столбцов с ожидаемыми значениями

Спасибо, но я все еще получаю сообщение об ошибке, вероятно, потому, что "Año" использует "ñ", а "Día" использует "í". Ошибка, которую я получаю, заключается в том, что когда я использую часть «cnames», я получаю следующее сообщение: «Ошибка в подпрограмме (re, «», x, perl = TRUE): входная строка 1 недействительна UTF-8».

Rai 22.05.2019 10:57

Другие вопросы по теме