У меня есть значение dataframe, состоящее из символьных столбцов и свойства dataframe, состоящее из имен столбцов значений dataframe и предопределенного типа данных. Мне нужно проверить, соответствуют ли типы данных значений предопределенному типу данных. Поэтому я хочу изменить типы данных в кадре данных значений на основе предопределенных типов данных в кадре данных свойств в автоматическом режиме с использованием map (), apply () или a для l oop, предпочтительно аккуратного (стих) решения.
Ниже приведен пример, но фактический набор данных имеет гораздо больше столбцов / свойств.
# Libraries
library(dplyr)
# Seed
set.seed(12345)
# Property example
properties <-
tibble(property = c("a", "b", "c"),
datatype = c("logical", "integer", "double"))
# Values example
values <-
tibble(a = sample(c("TRUE", "FALSE", "CORRECT"), 10, replace = TRUE),
b = as.character(sample(c(1:9, 1.4), 10)),
c = sample(c(-1.5:1.5, "word"), 10, replace = TRUE))
properties
## A tibble: 3 x 2
# property datatype
# <chr> <chr>
#1 a logical
#2 b integer
#3 c double
values
## A tibble: 10 x 3
# a b c
# <chr> <chr> <chr>
# 1 FALSE 7 -1.5
# 2 CORRECT 1 word
# 3 FALSE 8 1.5
# 4 FALSE 1.4 -0.5
# 5 TRUE 6 -0.5
# 6 CORRECT 9 1.5
# 7 FALSE 4 0.5
# 8 FALSE 2 1.5
# 9 CORRECT 3 -1.5
#10 FALSE 5 -1.5
В качестве части моей проверки я буду сравнивать количество NA на столбец до и после преобразования. , Это создает другую проблему, так как двойные значения будут автоматически преобразованы в целые числа, в то время как это должно стать NA, потому что это неверный тип данных (столбец b, строка 4).
# Prefered result
tibble(a = c(FALSE, NA, FALSE, FALSE, TRUE, NA, FALSE, FALSE, NA, FALSE),
b = c(7L, 1L, 8L, NA_integer_, 6L, 9L, 4L, 2L, 3L, 5L),
c = c(-1.5, NA, 1.5, -0.5, -0.5, 1.5, 0.5, 1.5, -1.5, -1.5))
## A tibble: 10 x 3
# a b c
# <lgl> <int> <dbl>
# 1 FALSE 7 -1.5
# 2 NA 1 NA
# 3 FALSE 8 1.5
# 4 FALSE NA -0.5
# 5 TRUE 6 -0.5
# 6 NA 9 1.5
# 7 FALSE 4 0.5
# 8 FALSE 2 1.5
# 9 NA 3 -1.5
#10 FALSE 5 -1.5
Вся помощь очень ценится !