Как применить функцию к указанным c столбцам в кадре данных и заменить исходные столбцы? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть большой фрейм данных, содержащий медицинские данные (my.medical.data).
В ряде столбцов содержатся даты (например, дата госпитализации), имена каждого из этих столбцов заканчиваются на "_date".
Я хотел бы применить функцию lubridate::dmy() к столбцам, содержащим даты, и перезаписать мой исходный кадр данных с помощью вывода этой функции.
Было бы замечательно иметь общее решение, которое может быть применено с использованием любой функции, а не только мой dmy() пример.

По сути, я хочу применить следующее ко всем моим столбцам дат:

my.medical.data$admission_date <- lubridate::dmy(my.medical.data$admission_date)
my.medical.data$operation_date <- lubridate::dmy(my.medical.data$operation_date)
etc.

Я пробовал это:

date.columns <- select(ICB, ends_with("_date"))
date.names <- names(date.columns)
date.columns <- transmute_at(my.medical.data, date.names, lubridate::dmy)

Теперь date.columns содержит мои столбцы даты в формате «Дата», а не исходные факторы. Теперь я хочу заменить столбцы даты в my.medical.data новыми столбцами в правильном формате.

my.medical.data.new <- full_join(x = my.medical.data, y = date.columns)

Теперь я получаю:

Ошибка: невозможно присоединить объект Date с объектом, который не является объектом Date

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

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Как обычно, трудно ответить без примера набора данных, но это должно сработать:

library(dplyr)

my.medical.data <- my.medical.data %>%
  mutate_at(vars(ends_with('_date')), lubridate::dmy)

Это приведет к мутированию на месте каждой переменной, оканчивающейся на «_date», применяя функцию. Также может применяться несколько функций. См. ?mutate_at (что также является справкой для mutate_if)

0 голосов
/ 03 апреля 2020

Несколько способов сделать это.

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

данных. таблица

Вы можете использовать := (обновление по оператору ссылки) вместе с lapplỳ, чтобы применить lubridate::ymd ко всем столбцам, определенным в .SDcols измерении

library(data.table)
setDT(my.medical.data)

cols_to_change <- endsWith("_date", colnames(my.medical.date))

my.medical.data[, c(cols_to_change) := lapply(.SD, lubridate::ymd), .SDcols = cols_to_change]

base R

Стандартный lapply также может помочь. Вы можете попробовать что-то подобное (я не проверял)

my.medical.data[, cols_to_change] <- lapply(cols_to_change, function(d) lubridate::ymd(my.medical.data[,d]))
...