POSIXct值成为reshape2 dcast数字(POSIXct values become n

2019-09-22 04:08发布

我试图用dcast从最新reshape2包(1.2.1)进行非规范化的数据帧(或data.table),其中value.var是POSIXct类型,但所得到的数据帧,该日期值已经失去了他们POSIXct课堂,成为数字。

难道我真的要as.POSIXct()每次生成列,如果我想要的值追溯到POSIXct的,还是我失去了一些东西?

x <- c("a","b");
y <- c("c","d");
z <- as.POSIXct(c("2012-01-01 01:01:01","2012-02-02 02:02:02"));
d <- data.frame(x, y, z, stringsAsFactors=FALSE);
str(d);
library(reshape2);
e <- dcast(d, formula = x ~ y, value.var = "z");
str(e);

上述声明运行的结果(注意:新列c和d是数字时代秒而不是POSIXct的):

> x <- c("a","b");
> y <- c("c","d");
> z <- as.POSIXct(c("2012-01-01 01:01:01","2012-02-02 02:02:02"));
> d <- data.frame(x, y, z, stringsAsFactors=FALSE);
> str(d);
'data.frame':   2 obs. of  3 variables:
 $ x: chr  "a" "b"
 $ y: chr  "c" "d"
 $ z: POSIXct, format: "2012-01-01 01:01:01" "2012-02-02 02:02:02"
> library(reshape2);
> e <- dcast(d, formula = x ~ y, value.var = "z");
> str(e);
'data.frame':   2 obs. of  3 variables:
 $ x: chr  "a" "b"
 $ c: num  1.33e+09 NA
 $ d: num  NA 1.33e+09

Answer 1:

这样做debug(dcast)debug(as.data.frame.matrix)通过您发起的计算,然后踩着dcast()调用,就会发现,在这些线路as.data.frame.matrix()有过错:

if (mode(x) == "character" && stringsAsFactors) {
    for (i in ic) value[[i]] <- as.factor(x[, i])
}
else {
    for (i in ic) value[[i]] <- as.vector(x[, i])
}

向上到然后POSIXct对象具有模式"numeric" ,所以评价如下所述第二分支,其结果转换为数字。

如果你使用dcast()它看起来像你将需要进行后期处理的结果,这应该不是太难,如果你有正确的origin 。 像这样的事情(不完全得到的origin右)应该做的伎俩:

e[-1] <- lapply(e[-1], as.POSIXct, origin="1960-01-01")

FWIW,基础R的reshape()离开POSIXct值,因为它们,但需要您编辑生成的列的名称...

reshape(d, idvar="x", timevar="y",  direction="wide")
#   x                 z.c                 z.d
# 1 a 2012-01-01 01:01:01                <NA>
# 2 b                <NA> 2012-02-02 02:02:02


Answer 2:

我只是遇到了这个问题为好。 我首先强迫日期字段成字符,然后dcast,然后再转换回一个日期解决它。



文章来源: POSIXct values become numeric in reshape2 dcast
标签: r reshape2