将 POSIXct 转换为 Date 类的函数

pet*_*ler 3 r lubridate purrr

您好,我正在尝试编写一个接受数据帧的函数,并将所有 POSIXct 或 POSIXlt 类型转换为 R 中的日期类型。我已经创建了该函数的一部分,但我一直在迭代每个索引处的元素。

#Basic Data Frame
patientID <- c(1, 2, 3, 4)
AdmDate <- as.POSIXct(c('2010-10-11','2008-3-25','2016-4-23','2011-6-12'))
diabetes <- c("Type1", "Type2", "Type1", "Type2")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, AdmDate, diabetes, status)


convertallPOSIXct <- function(data){
 if(getdata[[is.POSIXt()=='TRUE']])
   getdata[[]] <- class(as.Date()) 
}

getdata <- function(x) {
  chr_test <- x %>%
    map_chr(~ paste(class(.), collapse = "/"))
}
Run Code Online (Sandbox Code Playgroud)

获取数据函数似乎可以工作,但我不确定如何从 getdata 中获取每个元素并将其转换为 R 中的 Date 类。谢谢!

nru*_*ell 5

这是一种选择lapply

df <- patientdata

df[] <- lapply(df, function(x) {
    if (inherits(x, "POSIXt")) as.Date(x) else x
})

str(df)
# 'data.frame': 4 obs. of  4 variables:
#  $ patientID: num  1 2 3 4
#  $ AdmDate  : Date, format: "2010-10-11" "2008-03-25" ...
#  $ diabetes : chr  "Type1" "Type2" "Type1" "Type2"
#  $ status   : chr  "Poor" "Improved" "Excellent" "Poor"
Run Code Online (Sandbox Code Playgroud)

[]是保留data.frame结构所必需的,否则您最终会得到一个普通的列表。首选使用inherits代替,class(object) == "some_class"因为如果对象有多个类(对象有多个POSIXt,您仍然会得到一个逻辑结果:

class(patientdata[,2]) == "POSIXt"
#[1] FALSE  TRUE

inherits(patientdata[,2], "POSIXt")
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)

  • 在计算机时代,我们通常使用 &lt;kbd&gt;CTRL&lt;/kbd&gt; + &lt;kbd&gt;c&lt;/kbd&gt; / &lt;kbd&gt;CTRL&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; 而不是手动编写东西:) (2认同)