如何将函数应用于数据框中的特定列并替换原始列?

时间:2020-04-03 10:44:41

标签: r dplyr tidyverse lubridate

我有一个包含医疗数据(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 个答案:

答案 0 :(得分:1)

像往常一样,没有示例数据集就很难回答,但这应该可以完成工作:

library(dplyr)

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

这将应用功能将该位置以'_date'结尾的每个变量进行适当的突变。它还可以应用多种功能。请参见?mutate_at(这也是mutate_if的帮助)

答案 1 :(得分:0)

几种方法。

如果您要处理大量数据,我认为data.table是最好的方法(它将为您带来灵活性,速度和存储效率)

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]

基本R

标准lapply也可以提供帮助。您可以尝试类似的方法(我没有测试过)

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