7

最新のパッケージ (1.2.1) の dcast を使用して、value.var が POSIXct 型であるデータ フレーム (または data.table) を非正規化しようとしていますが、結果のデータ フレームでは日付値が失われています。それらの POSIXct クラスと数値になります。

値を POSIXct のものに戻したい場合、生成されたすべての列を as.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
4

3 に答える 3

10

と を実行してから、呼び出しによって開始された計算をステップ実行する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])
}

uptothen POSIXct オブジェクトには mode"numeric"があるため、評価は結果を数値に変換する 2 番目のブランチに従います。

を使用する場合dcast()、結果を後処理する必要があるように見えますが、正しい があればoriginそれほど難しくはありません。このようなもの(これは完全にはorigin正しくありません)がうまくいくはずです:

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

FWIW、ベース Rreshape()は 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
于 2012-09-06T00:40:43.630 に答える
1

データセットをキャスト/拡張するときの日付の整合性の前処理および/または後処理は、非常に面倒な場合があります。

その点で、必要な再形成が複雑でない限り、パッケージtidyrのpivot_wider()は日付オブジェクトを尊重します - 途中で変換はありません。さらに、キャスティング/ワイドニング プロセスをより詳細に制御できるため、後処理手順を回避できます ( https://tidyr.tidyverse.org/reference/pivot_wider.html )。

于 2020-05-09T20:18:08.473 に答える