将列表中存储的数据类型转换为Date R

时间:2018-09-17 05:46:16

标签: r datetime lapply

我有一个列表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))

这不起作用。它仅返回日期,并且不更改数据类型。 有什么快速的方法可以转换这种格式?

我可以使用for循环解决此问题。

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

但是我想使用sapply或lappy。

1 个答案:

答案 0 :(得分:0)

最好先将factor转换为character,然后再转换为Date格式。最简单的方法是使用lubridate包。 ymd转换格式为character的向量,例如2018-11-22转换为年月日日期时间对象。请注意lambda函数主体,在更改数据框后将其键入x,这是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" ...