首页 > 解决方案 > 将存储在列表中的数据类型转换为日期 R

问题描述

我有一个清单data

每个都有几个数据框。

[[1]]
ID: int [1:100] ...
Date: Factor w/ ...
days: num [1:100] ...
[[2]]
ID: int [1:100] ...
Date: Factor w/ ...

像这样。

我想将该因素转换为日期格式。
我考虑过
取消列表 - 更改格式 - 使其再次列出。

但我不知道该怎么做..

sapply(data, function(x) x$Date <- as.Date(x$Date))

这行不通。它只返回 Date 而不会更改数据类型。有什么快速的方法来转换这种格式吗?

我可以通过使用 for 循环来解决这个问题。

for(i in 1:2){
data[[i]]$Date <- as.Date(data[[i]]$Date)}

但我想使用 sapply 或 lappy。

标签: rdatetimelapply

解决方案


最好先转换factorcharacterDate格式化。最简单的方法是使用lubridate包。ymdcharacter格式向量转换2018-11-22为年-月-日日期时间对象。请注意 lambda-function body,数据框改变后是 typex的,是return(x). 请看下面的代码:

library(lubridate)

# simulation of data
df1 <- data.frame(
  ID = 1:100, 
  Date = as.factor(sample(seq(ymd("2018-01-01"), ymd("2018-12-01"), 1), 100)),
  days = sample(100))

df2 <- data.frame(
  ID = 1:100, 
  Date = as.factor(sample(seq(ymd("2018-01-01"), ymd("2018-12-01"), 1), 100, replace =TRUE)))

dfs <- list(df1, df2)

str(dfs)

# List of 2
# $ :'data.frame':  100 obs. of  3 variables:
#   ..$ ID  : int [1:100] 1 2 3 4 5 6 7 8 9 10 ...
#   ..$ Date: Factor w/ 100 levels "2018-01-06","2018-01-10",..: 17 89 40 2 84 46 58 62 66 43 ...
#   ..$ days: int [1:100] 50 4 19 6 33 47 95 25 13 5 ...
# $ :'data.frame':  100 obs. of  2 variables:
#   ..$ ID  : int [1:100] 1 2 3 4 5 6 7 8 9 10 ...
#   ..$ Date: Factor w/ 87 levels "2018-01-03","2018-01-04",..: 3 30 61 6 78 34 5 71 49 55 ...

# handling the data
dfs_2 <- lapply(dfs, function(x) {
  x$Date <- ymd(as.character(x$Date))
  x
})

str(dfs_2)
# List of 2
# $ :'data.frame':  100 obs. of  3 variables:
#  ..$ ID  : int [1:100] 1 2 3 4 5 6 7 8 9 10 ...
#  ..$ Date: Date[1:100], format: "2018-03-10" "2018-10-25" "2018-11-25" ...
#  ..$ days: int [1:100] 7 99 75 91 30 78 9 82 15 37 ...
# $ :'data.frame':  100 obs. of  2 variables:
#  ..$ ID  : int [1:100] 1 2 3 4 5 6 7 8 9 10 ...
#  ..$ Date: Date[1:100], format: "2018-05-30" "2018-05-20" "2018-05-13" ...

推荐阅读