Повторно приведите типы столбцов к фрейму данных, который уже был прочитан - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть фрейм данных df1 (со многими столбцами), который я хочу объединить с другим фреймом данных df2, который должен иметь те же типы столбцов.Однако по какой-то причине при записи и повторном чтении они приобрели разные типы.

Когда я хочу объединить эти фреймы данных, из-за некоторых столбцов, которые не имеют одинаковый тип (но должны были иметь), он отказывается присоединиться.

Как я могу заставить R повторно привести классы df2 к классам df1?

Например:

df1 <- data.frame(x = c(NA, NA, "3", "3"), y = c(NA, NA, "a", "b"))
df1_class <- sapply(df1, class) #first, determine the different classes of df1
df2 <- data.frame(x = c(NA, NA, 3, 3), y = c(NA, NA, "a", "b")) # df2 is 
# equal to df1 but has a different class in column x

# now cast column x of df2 as class "character" - but do this for all 
# columns together because there are many columns....

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

При использовании пакета purrr следующее обновит df2 для соответствия классам df1:

df1_class <- sapply(df1, class)
df2 <- 
  purrr::map2_df(
  df2,
  df1_class,
  ~ do.call(paste0('as.', .y), list(.x))
)
0 голосов
/ 23 сентября 2018

Вы можете изменить ?mode каждого столбца, используя "mode<-" через Map.

df2[] <- Map(f = "mode<-", x = df2, value = df1_class)
df2
# A tibble: 4 x 3
#  x     y         z
#  <chr> <chr> <dbl>
#1 NA    NA        2
#2 NA    NA        2
#3 3     a         2
#4 3     b         2

Ваши данные расширены на третий столбец для иллюстрации.

data

library(tibble)
df1 <- data_frame(x = c(NA, NA, "3", "3"), y = c(NA, NA, "a", "b"), z = 1)
df2 <- data_frame(x = c(NA, NA, 3, 3), y = c(NA, NA, "a", "b"), z = 2L)
(df1_class <- sapply(df1, class))
#          x           y           z 
#"character" "character"   "numeric"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...