我有一个包含2017年10月份记录的数据框。第6列将日期作为字符向量。
这就是它的样子:
> october2017[1:6,1:6]
V1 V2 V3 V4 V5 V6
1 89108060 IN0000005 P2 RK1 CA1-R 10/1/2017
2 10503818 IN0000014 P2 RK1 CA31 10/2/2017
3 89108152 765000054 P2 RK1 CA31 10/3/2017
4 89108152 765000197 P2 RK1 CA31 10/4/2017
5 89108206 200000162 P2 RK1 CA31 10/5/2017
6 89108206 100001098 P2 RK1 CA31 10/6/2017
> class(october2017$V6)
[1] "character"
实际数据框比这大得多。我想要做的是创建一个新列来表示与每个日期匹配的星期几并将其添加到数据框中。如果日期是“10/1/2017”,我希望新列表示星期几在该行中显示“星期日”。
这就是我想要数据框的样子:
> october2017[1:6,1:7]
V1 V2 V3 V4 V5 V6 V7
1 89108060 IN0000005 P2 RK1 CA1-R 10/1/2017 Sunday
2 10503818 IN0000014 P2 RK1 CA31 10/2/2017 Monday
3 89108152 765000054 P2 RK1 CA31 10/3/2017 Tuesday
4 89108152 765000197 P2 RK1 CA31 10/4/2017 Wednesday
5 89108206 200000162 P2 RK1 CA31 10/5/2017 Thursday
6 89108206 100001098 P2 RK1 CA31 10/6/2017 Friday
这是我试过的: newcol =工作日(as.Date(october2017 $ v6,format =“%m /%d /%Y”)) october2017 = cbind(october2017,newcol,stringsAsFactors = FALSE)
这是我尝试运行此代码的第一行时收到的错误消息: as.Date.default出错(october2017 $ v6,format =“%m /%d /%Y”): 不知道如何将'october2017 $ v6'转换为类“Date”
任何人都可以帮助我理解为什么会这样吗?
答案 0 :(得分:2)
as.Date
是一个使用S3方法调度的函数。也就是说,实际上有几个功能:
methods("as.Date")
# [1] as.Date.character as.Date.date as.Date.dates as.Date.default
# [5] as.Date.factor as.Date.numeric as.Date.POSIXct as.Date.POSIXlt
# see '?methods' for accessing help and source code
当你调用as.Date(x)
时,R会查看第一个对象的类并使用适当的S3方法。如果没有找到并且存在.default
函数,那么它将被用作“最后的手段”。
如果您查看每种方法的来源,您只会在"do not know how to convert"
中找到字符串as.Date.default
:
as.Date.default
# function (x, ...)
# {
# if (inherits(x, "Date"))
# return(x)
# if (is.logical(x) && all(is.na(x)))
# return(structure(as.numeric(x), class = "Date"))
# stop(gettextf("do not know how to convert '%s' to class %s",
# deparse(substitute(x)), dQuote("Date")), domain = NA)
# }
如果它是已知类之一(character
,date
,dates
,factor
,numeric
,POSIXct
或{ {1}},现在也不是POSIXlt
或Date
- logical
),那么它将运行特定的函数(其中没有一个包含该错误字符串)。这表明您的NA
列是不同的类。没有MWE,这是完全的推测。
我建议您找到实际的数据类
$v6
并弄清楚如何将其转换为已知版本之一。
<强> 修改 强>
此外,请注意R 区分大小写。您的MWE使用小写class(dataFrame$v6)
但您的列名称是大写的。怎么样只是
v6
当您查看october2017$V7 <- weekdays(as.Date(oct$V6, format="%m/%d/%Y"))
(小写)时,会返回october2017$v6
,这会触发NULL
的{{1}}方法。
答案 1 :(得分:0)
这是事实发生后的几年,但是我想添加我用来解决该错误的替代方法。
首先,我将包含日期的字符向量拉到一个新的向量中,然后将其转换为包含日期类向量的1列数据框。从那里,我可以覆盖日期中的原始列。
dates <- data$date.column
dates <- data.frame(as.Date(dates, format = "%Y-%m-%d"))
data$date.column <- dates
我不确定是否需要在中间步骤中将as.Date()调用包装在data.frame()中,但是我发现如果没有它,它会失败。
希望有帮助!