【问题标题】:How do I apply a function to specific columns in a dataframe and replace the original columns?如何将函数应用于数据框中的特定列并替换原始列?
【发布时间】:2020-04-03 10:44:41
【问题描述】:

我有一个包含医疗数据的大型数据框 (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 新手,但我怀疑有一种更简单的方法可以做到这一点(例如直接处理原始数据帧),或者可能是加入/合并两个数据帧的正确方法。

【问题讨论】:

    标签: r dplyr tidyverse lubridate


    【解决方案1】:

    像往常一样,如果没有示例数据集就很难回答,但这应该可以解决问题:

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

    这将改变以“_date”结尾的每个变量,应用该函数。它还可以应用多种功能。见?mutate_at(这也是mutate_if的帮助)

    【讨论】:

      【解决方案2】:

      有几种方法可以做到这一点。

      如果您处理大量数据,我认为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]))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-11
        • 2021-09-06
        • 1970-01-01
        • 1970-01-01
        • 2020-11-22
        相关资源
        最近更新 更多