Skip to content

Commit dbfe7fa

Browse files
authored
Merge pull request #229 from r-transit/dev/NA_strings_and_field_types
Empty strings as NA and numeric field types
2 parents 9a091f5 + 386051c commit dbfe7fa

7 files changed

Lines changed: 31 additions & 26 deletions

File tree

R/convert_types.R

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,31 @@ convert_types <- function(gtfs_list, conversion_table, conversion_function) {
2222
}
2323

2424
convert_char_to_date <- function(gtfs_list) {
25-
convert_types(gtfs_list, gtfs_reference_types$Date, .parse_gtfsio_date)
25+
convert_types(gtfs_list, gtfs_reference_types[["Date"]], .parse_gtfsio_date)
2626
}
2727

2828
convert_date_to_char <- function(gtfs_obj) {
29-
convert_types(gtfs_obj, gtfs_reference_types$Date, .date_as_gtfsio_char)
29+
convert_types(gtfs_obj, gtfs_reference_types[["Date"]], .date_as_gtfsio_char)
3030
}
3131

3232
convert_char_to_hms <- function(gtfs_list) {
33-
convert_types(gtfs_list, gtfs_reference_types$Time, hhmmss_to_hms)
33+
convert_types(gtfs_list, gtfs_reference_types[["Time"]], hhmmss_to_hms)
3434
}
3535

3636
convert_hms_to_char <- function(gtfs_obj) {
37-
convert_types(gtfs_obj, gtfs_reference_types$Time, hms_to_hhmmss)
37+
convert_types(gtfs_obj, gtfs_reference_types[["Time"]], hms_to_hhmmss)
38+
}
39+
40+
# reading only
41+
convert_char_to_int <- function(gtfs_obj) {
42+
int_ref = do.call("rbind",
43+
gtfs_reference_types[c("Integer", "Non-negative integer", "Non-null integer",
44+
"Non-zero integer", "Positive integer")])
45+
convert_types(gtfs_obj, int_ref, as.integer)
46+
}
47+
48+
convert_char_to_num <- function(gtfs_obj) {
49+
num_ref = do.call("rbind",
50+
gtfs_reference_types[c("Float", "Positive float", "Non-negative float")])
51+
convert_types(gtfs_obj, num_ref, as.double)
3852
}

R/tidygtfs.R

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ gtfs_to_tidygtfs = function(gtfs_list, files = NULL) {
5959
x <- convert_list_tables_to_tibbles(x)
6060
x <- convert_list_json_to_sf(x)
6161

62+
# convert empty strings "" to NA
63+
x <- empty_strings_to_na(x)
64+
6265
# gtfs class base structure
6366
x <- gtfsio::new_gtfs(x)
6467
class(x) <- c("tidygtfs", "gtfs", "list")
@@ -70,6 +73,8 @@ gtfs_to_tidygtfs = function(gtfs_list, files = NULL) {
7073
prepare_tidygtfs_fields = function(gtfs_obj) {
7174
gtfs_obj <- convert_char_to_hms(gtfs_obj)
7275
gtfs_obj <- convert_char_to_date(gtfs_obj)
76+
gtfs_obj <- convert_char_to_int(gtfs_obj)
77+
gtfs_obj <- convert_char_to_num(gtfs_obj)
7378
return(gtfs_obj)
7479
}
7580

R/utils.R

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,17 @@ feed_has_non_empty_table <- function(gtfs_obj, table_name) {
2323

2424
#' Convert empty strings ("") to NA values in all gtfs tables
2525
#'
26+
#' [read_gtfs()] converts all empty strings to `NA` values
27+
#'
2628
#' @param gtfs_obj gtfs feed (tidygtfs object)
2729
#'
2830
#' @return a gtfs_obj where all empty strings in tables have been replaced with NA
2931
#' @seealso [na_to_empty_strings()]
3032
#' @export
3133
empty_strings_to_na = function(gtfs_obj) {
3234
tbl_names = names(gtfs_obj)
33-
tbl_names <- tbl_names[tbl_names != "."]
35+
non_txt = names(gtfs_reference_filetype[gtfs_reference_filetype != "txt"])
36+
tbl_names <- setdiff(tbl_names, c(".", non_txt))
3437
for(tbl in tbl_names) {
3538
if(inherits(gtfs_obj[[tbl]], "data.frame")) {
3639
gtfs_obj[[tbl]][gtfs_obj[[tbl]] == ""] <- NA
@@ -40,6 +43,8 @@ empty_strings_to_na = function(gtfs_obj) {
4043
}
4144

4245
#' Convert NA values to empty strings ("")
46+
#'
47+
#' [write_gtfs()] converts `NA` to empty strings
4348
#'
4449
#' @param gtfs_obj gtfs feed (tidygtfs object)
4550
#' @return a gtfs_obj where all NA strings in tables have been replaced with ""

data/gtfs_duke.rda

121 Bytes
Binary file not shown.

man/empty_strings_to_na.Rd

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/na_to_empty_strings.Rd

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/test-utils.R

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -93,25 +93,6 @@ test_that("filter_feed_by_date", {
9393
expect_s3_class(g2$stop_times, "tbl_df")
9494
})
9595

96-
test_that("empty_strings_to_na", {
97-
gpath = system.file("extdata", "sample-feed-fixed.zip", package = "tidytransit")
98-
g1 = read_gtfs(gpath)
99-
g_na = empty_strings_to_na(g1)
100-
g2 = na_to_empty_strings(g_na)
101-
102-
for(tbl in names(g1)) {
103-
expect_equal(g1[[tbl]], g2[[tbl]])
104-
}
105-
106-
tmppath = tempfile(fileext = ".zip")
107-
write_gtfs(g_na, tmppath)
108-
g3 = read_gtfs(tmppath)
109-
110-
for(tbl in names(g1)) {
111-
expect_equal(g1[[tbl]], g3[[tbl]])
112-
}
113-
})
114-
11596
test_that("feed_contains, feed_has_non_empty_table", {
11697
g = gtfs_duke
11798
expect_false(feed_contains(g, "dates_services"))

0 commit comments

Comments
 (0)