context("Test to_labelled()")
test_that("to_labelled.factor preserves variable label", {
x <- factor(c(1, 1, 2))
var_label(x) <- "test"
expect_equal(var_label(to_labelled(x)), var_label(x))
x <- factor(c("no", "yes", "no"))
var_label(x) <- "test"
expect_equal(
var_label(to_labelled(x, labels = c("yes" = 1, "no" = 2))),
var_label(x)
)
})
test_that("to_labelled.factor preserves labelled character vectors", {
s1 <- labelled(c("M", "M", "F"), c(Male = "M", Female = "F"))
expect_equal(s1, to_labelled(to_factor(s1), val_labels(s1)))
})
test_that("to_labelled.factor preserves labelled numerical vectors", {
s2 <- labelled(c(1, 1, 2), c(Male = 1, Female = 2))
expect_equal(s2, to_labelled(to_factor(s2), val_labels(s2)))
})
test_that("to_labelled.factor converts to NA factor levels not found in labels", { # nolint
f <- factor(
c("yes", "yes", "no", "no", "don't know", "no", "yes", "don't know")
)
expect_equal(
to_labelled(f, c("yes" = 1, "no" = 2)),
labelled(c(1, 1, 2, 2, NA, 2, 1, NA), c("yes" = 1, "no" = 2))
)
})
test_that("to_labelled.factor accepts non continuous labels", {
f <- factor(
c("yes", "yes", "no", "no", "don't know", "no", "yes", "don't know")
)
expect_equal(
to_labelled(f, c("yes" = 1, "no" = 2, "don't know" = 9)),
labelled(
c(1, 1, 2, 2, 9, 2, 1, 9),
c("yes" = 1, "no" = 2, "don't know" = 9)
)
)
})
test_that("to_labelled.factor works with '[code] label' factors", {
l <- labelled(
c(1, 1, 2, 2, 9, 2, 1, 9),
c("yes" = 1, "no" = 2, "don't know" = 9)
)
expect_equal(
to_factor(l, levels = "p") %>% to_labelled(),
l
)
l <- labelled(
c("M", "M", "F", "X", "N/A"),
c(Male = "M", Female = "F", Refused = "X", "Not applicable" = "N/A")
)
expect_equal(
to_factor(l, levels = "p") %>% to_labelled(),
l
)
# if labels is provided apply normal rule
l <- labelled(
c(1, 1, 2, 2, 9, 2, 1, 9),
c("yes" = 1, "no" = 2, "don't know" = 9)
)
f <- to_factor(l, levels = "p")
x <- f %>% to_labelled(labels = c("[1] yes" = 123, "[2] no" = 456))
expect_equivalent(
unclass(x),
c(123, 123, 456, 456, NA, 456, 123, NA)
)
# should not be applied if duplicates in code
f <- factor(c("[1] yes", "[2] no", "[1] don't know"))
expect_warning(l <- to_labelled(f))
expect_warning(l <- to_labelled(f, .quiet = TRUE), NA)
expect_identical(
names(val_labels(l)),
levels(f)
)
# check potential duplicates in numerical codes
f <- factor(c("[1] yes", "[1.0] no", "[01] don't know"))
expect_warning(to_labelled(f))
expect_warning(to_labelled(f, .quiet = TRUE), NA)
expect_true(is.character(to_labelled(f, .quiet = TRUE)))
})
# foreign_to_labelled -----------------------------------------------------
test_that("foreign_to_labelled works correctly", {
utils::data("spss_file", package = "labelled")
utils::data("dta_file", package = "labelled")
tl_spss_list <- to_labelled(spss_file)
expect_equal(
val_labels(tl_spss_list),
sapply(spss_file, function(x) attr(x, "value.labels", exact = TRUE))
)
expect_equal(
var_label(tl_spss_list),
as.list(attr(spss_file, "variable.labels", exact = TRUE))
)
miss_attr <- attr(spss_file, "missings", exact = TRUE)
miss_list <- lapply(
miss_attr,
function(x) {
if (x$type == "none") {
return(NULL)
} else {
return(x$value)
}
}
)
expect_equal(sapply(tl_spss_list, na_values), miss_list)
expect_true(
all(
which(sapply(tl_spss_list, function(x) any(is.na(x)))) == c(4, 5, 7, 10)
)
)
tl_spss_df <- to_labelled(as.data.frame(spss_file, stringsAsFactors = FALSE))
expect_equal(
val_labels(tl_spss_df),
sapply(spss_file, function(x) attr(x, "value.labels", exact = TRUE))
)
expect_true(all(sapply(var_label(tl_spss_df), is.null)))
expect_true(all(sapply(sapply(tl_spss_df, na_values), is.null)))
expect_true(all(sapply(sapply(tl_spss_df, na_range), is.null)))
tl_dta_df <- to_labelled(dta_file)
expect_equal(
val_labels(tl_dta_df),
sapply(dta_file, function(x) attr(x, "value.labels", exact = TRUE))
)
expect_equal(
unname(unlist(var_label(tl_dta_df))),
attr(dta_file, "var.labels", exact = TRUE)
)
expect_true(all(sapply(sapply(tl_dta_df, na_values), is.null)))
expect_true(all(sapply(sapply(tl_dta_df, na_range), is.null)))
})
# memisc_to_labelled -----------------------------------------------------
test_that("memisc_to_labelled works correctly", {
skip_if_not_installed("memisc")
ds <- memisc::data.set(
vote = sample(c(1, 2, 3, 8, 9, 97, 99), size = 300, replace = TRUE),
region = sample(c(rep(1, 3), rep(2, 2), 3, 99), size = 300, replace = TRUE),
income = exp(rnorm(300, sd = .7)) * 2000
)
memisc::description(ds$vote) <- "Vote intention"
memisc::description(ds$region) <- "Region of residence"
memisc::description(ds$income) <- "Household income"
memisc::missing.values(ds$vote) <- c(97, 99)
memisc::missing.values(ds$region) <- list(range = c(90, Inf))
memisc::labels(ds$region) <- c(
England = 1,
Scotland = 2,
Wales = 3,
"Not applicable" = 97,
"Not asked in survey" = 99
)
memisc::labels(ds$vote) <- c(
Conservatives = 1,
Labour = 2,
"Liberal Democrats" = 3,
"Don't know" = 8,
"Answer refused" = 9,
"Not applicable" = 97,
"Not asked in survey" = 99
)
tl_ds <- to_labelled(ds)
desc <- data.frame(memisc::description(ds))
var_label_ds <- desc[, 2]
names(var_label_ds) <- desc[, 1]
expect_identical(unlist(var_label(tl_ds)), var_label_ds)
if (any(sapply(val_labels(tl_ds), function(x) !is.null(x)))) {
val_labels_ds <- lapply(ds, function(x) memisc::labels(x))
val_labels_ds <- lapply(ds, function(x) {
vlabs <- memisc::labels(x)
if (is.null(vlabs)) {
return(NULL)
}
vals <- vlabs@values
names(vals) <- vlabs@.Data
return(vals)
})
expect_identical(val_labels(tl_ds), val_labels_ds)
}
})
test_that("to_character works on data.frame", {
df <- data.frame(
x = labelled(c(1, 1, 2), c(yes = 1, no = 2)),
y = c("a", "a", "b"),
z = 1:3,
stringsAsFactors = FALSE
)
df2 <- to_character(df)
expect_true(is.character(df2$x))
expect_equal(class(df2$y), class(df$y))
expect_equal(class(df2$z), class(df$z))
df3 <- to_character(df, labelled_only = FALSE)
expect_true(is.character(df3$y))
expect_true(is.character(df3$z))
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.