data.frame中的新列不保留POSIXct类

zd287kbt  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(139)

我花了近两天的时间来寻找错误发生的原因-可能对许多人来说微不足道,但我不能找出原因,我感谢帮助:
当我创建一个新的data.frame并使用...$...语法添加一个特定类(POSIXct)的列时,它工作得很好(下面代码中的“p”列,它们如预期的那样成为类 POSIXct)。
然而,如果我使用...[..., ...]语法执行相同的操作,POSIX类在赋值时丢失(下面代码中的“n”列,因为它们无意中变成了class numeric)。
即使显式地设置了class,它仍使用...[..., ...]语法而不是...$....语法来保持数值。
这种行为背后的原因是什么?显然我已经找到了一个变通办法,但使用列名向量更方便,我担心我错过了一些非常基本的东西,但不知道是什么,或在哪里查找哪些关键字。

基本上我需要通过变量访问列,然后分配类和数据。

rm(dfDummy)  # just make sure there is no residual old data/columns leftover
dfDummy <- data.frame(a = 1:10, dummy = dummy)
dfDummy$p <- as.POSIXct(NA)
dfDummy$p.rep <- as.POSIXct(rep(NA, 10))
dfDummy[ , c("n1", "n2")] <- as.POSIXct(NA)
dfDummy[ , c("n1.rep", "n2.rep")] <- as.POSIXct(rep(NA, 10))
sapply(X = c("p", "p.rep", "n1", "n2", "n1.rep", "n2.rep"), function(x) class(dfDummy[, x]))
# even after setting the class explicitely, it remains "numeric" - what is wrong?
class(dfDummy[ , c("n1", "n2", "n1.rep", "n2.rep")]) <- c("POSIXct", "POSIXt")
sapply(X = c("p", "p.rep", "n1", "n2", "n1.rep", "n2.rep"), function(x) class(dfDummy[, x]))
icnyk63a

icnyk63a1#

这个问题实际上与使用$[没有任何关系,除了当使用$时分配单个列,而当使用[时分配多个列。
相反,当您为多个列赋值时,POSIXct向量被回收并简化为矩阵-而矩阵不能保存类POSIXct。
如果您传递的是一个列表,它将工作:

dfDummy[ , c("n1.rep", "n2.rep")] <- list(as.POSIXct(NA))

lapply(dfDummy[ , c("n1.rep", "n2.rep")], class)

$n1.rep
[1] "POSIXct" "POSIXt" 

$n2.rep
[1] "POSIXct" "POSIXt"

相关问题