如何将函数应用于数据框中的特定列并替换原始列?
How do I apply a function to specific columns in a dataframe and replace the original columns?
我有一个包含医疗数据的大型数据框 (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
包含我的日期列,采用 "Date" 格式,而不是原始因素。现在我想用正确格式的新列替换 my.medical.data
中的日期列。
my.medical.data.new <- full_join(x = my.medical.data, y = date.columns)
现在我得到:
Error: cannot join a Date object with an object that is not a Date object
我是一个 R 新手,但我怀疑有更简单的方法可以做到这一点(例如直接处理原始数据帧),或者可能是连接/合并两个数据帧的正确方法。
像往常一样,没有示例数据集很难回答,但这应该可以解决问题:
library(dplyr)
my.medical.data <- my.medical.data %>%
mutate_at(vars(ends_with('_date')), lubridate::dmy)
这将对每个以“_date”结尾的变量进行原地变异,应用该函数。它还可以应用多种功能。参见?mutate_at
(这也是对mutate_if
的帮助)
有几种方法可以做到这一点。
如果您处理大量数据,我认为 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]))
我有一个包含医疗数据的大型数据框 (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
包含我的日期列,采用 "Date" 格式,而不是原始因素。现在我想用正确格式的新列替换 my.medical.data
中的日期列。
my.medical.data.new <- full_join(x = my.medical.data, y = date.columns)
现在我得到:
Error: cannot join a Date object with an object that is not a Date object
我是一个 R 新手,但我怀疑有更简单的方法可以做到这一点(例如直接处理原始数据帧),或者可能是连接/合并两个数据帧的正确方法。
像往常一样,没有示例数据集很难回答,但这应该可以解决问题:
library(dplyr)
my.medical.data <- my.medical.data %>%
mutate_at(vars(ends_with('_date')), lubridate::dmy)
这将对每个以“_date”结尾的变量进行原地变异,应用该函数。它还可以应用多种功能。参见?mutate_at
(这也是对mutate_if
的帮助)
有几种方法可以做到这一点。
如果您处理大量数据,我认为 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]))