我试图理解为什么我的lubridate
mdy()
函数在lapply()
中返回错误以转换dplyr
管道中的日期。我已经以类似的方法在其他数据上使用了mdy()
,但是还没有看到这个问题。我对R还是比较陌生,但是直到现在为止都可以解决其他问题。我对如何使用lapply()
不太熟悉。
我的数据是一个很大的.csv水质数据,我将其设置为仅显示有问题的数据。
library(dplyr)
library(lubridate)
require(lubridate)
wq.all<-as.data.frame(read.csv('C:/WQdata.csv',header=TRUE,stringsAsFactors = FALSE))
test.wq<-wq.all[1:5,12:13]
class(test.wq)
[1] "data.frame"
mode(test.wq)
[1] "list"
str(test.wq)
'data.frame': 5 obs. of 2 variables:
$ YearMonth : chr "2019-07" "2019-06" "2019-05" "2019-04" ...
$ SampleTime: chr "07/09/2019 14:44" "06/10/2019 14:17" "05/22/2019 14:31" "04/08/2019 14:15" ...
在str(test.wq)
中,SampleTime
是我要从chr
强制为date
或至少为num
的问题数据。
首先,我不需要时间值,因此我使用dplyr
mutate()
创建了仅包含10个字符的日期的SampleDate
,然后尝试使用{ {1}}:
mdy()
但这会返回错误:
wq.date<-test.wq%>%
mutate(SampleDate=str_sub(test.wq[[2]],start=0,end=10))%>%
mdy(SampleDate)
如果我仅使用Error in lapply(list(...), .num_to_date) : object 'SampleDate' not found
,那么一切似乎都可以正常运行,并且为我提供了我一直在寻找的新mutate()
列:
SampleDate
因此,即使我wq.date<-test.wq%>%
mutate(SampleDate=str_sub(test.wq[[2]],start=0,end=10))
head(wq.date)
YearMonth SampleTime SampleDate
1 2019-07 07/09/2019 14:44 07/09/2019
2 2019-06 06/10/2019 14:17 06/10/2019
3 2019-05 05/22/2019 14:31 05/22/2019
4 2019-04 04/08/2019 14:15 04/08/2019
5 2019-03 03/13/2019 14:19 03/13/2019
str(wq.date)
'data.frame': 5 obs. of 3 variables:
$ YearMonth : chr "2019-07" "2019-06" "2019-05" "2019-04" ...
$ SampleTime: chr "07/09/2019 14:44" "06/10/2019 14:17" "05/22/2019 14:31" "04/08/2019 14:15" ...
$ SampleDate: chr "07/09/2019" "06/10/2019" "05/22/2019" "04/08/2019" ...
明确存在并且我相信自己引用正确,但一旦尝试使用mdy()
来强制执行,似乎只会导致错误。
我研究了其他帖子here和here,但似乎都没有解决这个问题。
有什么想法吗?非常感谢!
答案 0 :(得分:0)
我们需要将其包含在mutate
内或提取列,否则,它将对整个data.frame应用该函数。根据{{1}}
将字符和数字向量中存储的日期转换为Date或POSIXct对象
因此,如果输入的不是?mdy
,它将无法正常工作
vector