R警告:“项目,以取代的数目不替换长度的倍数”似乎不正确
问题描述:
我有一个为R脚本,看起来像这样:R警告:“项目,以取代的数目不替换长度的倍数”似乎不正确
# Create example data
date <- c("11/09/2016", "11/02/2016", "11/16/2016", "11/23/2016")
column_two <- c(4, 2, 3, 4)
# Populate a data frame and make sure the dates have the correct class
mydata <- data.frame(date, column_two)
mydata$date <- strptime(mydata$date, format="%m/%d/%Y")
print("The contents of mydata are:")
print(mydata)
# Create a dummy list (or vector, or array, or what is it?)
foo <- rep(NA, 5)
print("foo is initialized to:")
print(foo)
print("The class of foo is:")
print(class(foo))
earlydate <- min(mydata$date)
print(sprintf("Earliest date is: %s", earlydate))
print("The class of earlydate is:")
print(class(earlydate))
print(sprintf("Length of earliest date is: %d", length(earlydate)))
print(sprintf("Length of foo[2] is: %d", length(foo[2])))
# Attempt to set one variable equal to another
foo[2] <- earlydate
print("After assignment, foo looks like this:")
print(foo)
print("Now the classes of foo, foo[2], and foo[[2]] are:")
print(class(foo))
print(class(foo[2]))
print(class(foo[[2]]))
从脚本打印输出如下所示:
> source("test_warning.R")
[1] "The contents of mydata are:"
date column_two
1 2016-11-09 4
2 2016-11-02 2
3 2016-11-16 3
4 2016-11-23 4
[1] "foo is initialized to:"
[1] NA NA NA NA NA
[1] "The class of foo is:"
[1] "logical"
[1] "Earliest date is: 2016-11-02"
[1] "The class of earlydate is:"
[1] "POSIXlt" "POSIXt"
[1] "Length of earliest date is: 1"
[1] "Length of foo[2] is: 1"
[1] "After assignment, foo looks like this:"
[[1]]
[1] NA
[[2]]
[1] 0
[[3]]
[1] NA
[[4]]
[1] NA
[[5]]
[1] NA
[1] "Now the classes of foo, foo[2], and foo[[2]] are:"
[1] "list"
[1] "list"
[1] "numeric"
Warning message:
In foo[2] <- earlydate :
number of items to replace is not a multiple of replacement length
>
我有这么多的问题:
- 为什么我得到一个警告,当
foo[2]
和earlydate
显然是相同的长度? - 为什么foo [2]的值设置为
0
而不是值为earlydate
? - 很明显,R会自动将
foo
变量及其元素强制为新的类;为什么这些类别中的任何一个(foo
或foo[2]
或foo[[2]]
)似乎都与earlydate
变量的类别("POSIXlt" "POSIXt"
)相匹配? - 我该如何正确初始化
foo
,以便它成为一个向量,列表或类似数组的东西,其中包含能够支持这种类型值赋值的单独元素,而不会引发这种警告并导致这种反直觉行为?
答
那么,幕后的POSIXlt
实际上是一个列表。
> class(unclass(earlydate))
[1] "list"
> length(unclass(earlydate))
[1] 11
赋值为0,因为这是列表的第一个元素;它是秒数,earlydate
为0。
> unclass(earlydate)[1]
$sec
[1] 0
我真的不知道为什么R不自动要挟foo
可变进POSIXlt
类;我的猜测是,对日期的强制通常很难。很明显,在foo
是NA
的情况下要做什么,但如果其中一个元素已经是整数或字符串呢?但首先要自己强制使用,请使用as.POSIXlt
。
foo <- rep(as.POSIXlt(NA), 5)
取决于你会用它做什么其他,你也可能会发现使用POSIXct
是更好的解决方案,在这个答案讨论Integer to POSIXlt。它将日期存储为从原点开始的秒数,因此不是下面的列表,因此更适合于某些类型的计算和存储。