【问题标题】:Getting an error "number of items to replace is not a multiple of replacement length"收到错误“要替换的项目数不是替换长度的倍数”
【发布时间】:2015-03-05 09:24:54
【问题描述】:

我正在尝试使用strptime 函数将记录转换为日期和时间格式。但是,我不确定为什么会出现错误:

要替换的项目数不是替换长度的倍数。

我尝试使用length 函数检查记录的长度,但两者的长度相同。

data <- DT
head(data[6])
#                column
# 1 2014-12-22 23:53:48
# 2 2014-12-22 23:20:34
# 3 2014-12-22 23:20:30
# 4 2014-12-22 23:20:16
# 5 2014-12-22 23:20:07
# 6 2014-12-22 23:05:49

data[,6] <- as.character(data[,6])

temp_file <- matrix(0,nrow=nrow(data))

temp_file[1] <- strptime(data[1, 6],"%F %T")
# Warning message:
# In temp_file[1] <- strptime(data[1, 6], "%F %T") :
#   number of items to replace is not a multiple of replacement length

length(temp_file[1])
# [1] 1

length(data[1,6])
# [1] 1

length(strptime(data[1, 6], "%F %T") )
# [1] 1

非常感谢任何帮助。

谢谢!

【问题讨论】:

  • 这实际上是一个好问题。这不是错误,而是警告,但您得到的结果是错误的,因此您可以将其视为错误。发生这种情况的原因是因为在 R 中定义了 matrix,它只能得到原子向量。当您尝试将strptime 传递给矩阵时,它的类是"POSIXlt" "POSIXt",因此它取消分类并因此返回其属性列表(长度大于1),即unclass(strptime(data[1,1],"%F %T"))。第一个值为48 秒。这正是您现在在temp_file[1] 中所拥有的。
  • 因此,要么使用data.frame 而不是matrix,要么尝试将向量转换为原子向量,例如:temp_file[1] &lt;- as.character(strptime(data[1,1],"%F %T"))

标签: r dataframe matrix strptime


【解决方案1】:

您可以使用lubridate 包的ymd_hms 函数将字符向量转换为日期时间格式:

library(lubridate)

# data frame simulation
structure(list(X1 = c(1, 1, 1, 1, 1, 1), X1.1 = c(1, 1, 1, 1, 1, 1), 
    X1.2 = c(1, 1, 1, 1, 1, 1), X1.3 = c(1, 1, 1, 1, 1, 1), 
    X1.4 = c(1, 1, 1, 1, 1, 1), date_time_char = c("2014-12-22 23:53:48", 
    "2014-12-22 23:20:34", "2014-12-22 23:20:30", "2014-12-22 23:20:16", 
    "2014-12-22 23:20:07", "2014-12-22 23:05:49")), class = "data.frame", row.names = c(NA, -6L))

# transform from character to datetime
data$date_time <- ymd_hms(data[, 6])
data[, 7]

输出:

[1] "2014-12-22 23:53:48 UTC" "2014-12-22 23:20:34 UTC" "2014-12-22 23:20:30 UTC" "2014-12-22 23:20:16 UTC"
[5] "2014-12-22 23:20:07 UTC" "2014-12-22 23:05:49 UTC"

注意David Arenburg 的评论非常好:

这实际上是一个很好的问题。这不是错误,而是 警告,但是您得到的结果是错误的,因此您可以将其视为 一个错误。发生这种情况的原因是因为定义 R中的一个矩阵,只能得到原子向量。当你在尝试 将 strptime 传递给矩阵,它的类是“POSIXlt”“POSIXt”,因此 它取消了它的分类,因此返回了它的属性列表(其中 长度大于 1),即 unclass(strptime(data[1,1],"%F %T"))。 第一个值为 48 秒。这正是你所拥有的 temp_file[1] 现在。

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多