我有一个包含医疗数据(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新手,但是我怀疑有一个更简单的方法(例如,直接处理原始数据框),或者是正确的方式来合并/合并两个数据框。
答案 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
是最好的方法(它将为您带来灵活性,速度和存储效率)
您可以将:=
(由引用运算符更新)与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]
标准lapply
也可以提供帮助。您可以尝试类似的方法(我没有测试过)
my.medical.data[, cols_to_change] <- lapply(cols_to_change, function(d) lubridate::ymd(my.medical.data[,d]))