3

chronクラスでデータフレームを溶かそうとしています

library(chron)
x = data.frame(Index = as.chron(c(15657.00,15657.17)), Var1 = c(1,2), Var2 = c(9,8))
x
                Index Var1 Var2
1 (11/13/12 00:00:00)    1    9
2 (11/13/12 04:04:48)    2    8

y = melt(x,id.vars="Index")
Error in data.frame(ids, variable, value, stringsAsFactors = FALSE) : 
  arguments imply differing number of rows: 2, 4

私は次のようにだますことができas.numeric()ます:

x$Index= as.numeric(x$Index)
y = melt(x,id.vars="Index")
y$Index = as.chron(y$Index)
y
                Index variable value
1 (11/13/12 00:00:00)     Var1     1
2 (11/13/12 04:04:48)     Var1     2
3 (11/13/12 00:00:00)     Var2     9
4 (11/13/12 04:04:48)     Var2     8

しかし、それはもっと簡単でしょうか?(クロニクルクラスを維持したい)

4

2 に答える 2

2

(1)次のコードを実行する前に、このコマンドを発行したと仮定します。

library(reshape2)

その場合、代わりにreshapeパッケージを使用できます。この問題は発生しません。

library(reshape)

他の解決策は

(2)Rのreshape関数を使用します。

reshape(direction = "long", data = x, varying = list(2:3), v.names = "Var")

(3)または、chron列を数値に変換meltし、reshape2パッケージから使用してから、元に戻します。

library(reshape2)
xt <- transform(x, Index = as.numeric(Index))
transform(melt(xt, id = 1), Index = chron(Index))

追加のソリューションを追加しました。

于 2013-03-26T16:33:16.670 に答える
1

よくわかりませんが、これは時間の経過に伴う「見落とし」である可能性があると思いますまたは、おそらくdata.frameそうですが、そうは思われません)。

melt.data.frameこの問題は、reshape2でデータフレームを構築するときに発生します。これは通常、リサイクルを使用しますが、次の部分は次のdata.frameとおりです。

for (j in seq_along(xi)) {
    xi1 <- xi[[j]]
    if (is.vector(xi1) || is.factor(xi1)) 
        xi[[j]] <- rep(xi1, length.out = nr)
    else if (is.character(xi1) && class(xi1) == "AsIs") 
        xi[[j]] <- structure(rep(xi1, length.out = nr), class = class(xi1))
    else if (inherits(xi1, "Date") || inherits(xi1, "POSIXct")) 
        xi[[j]] <- rep(xi1, length.out = nr)
    else {
        fixed <- FALSE
        break
    }

chron変数はDateまたはPOSIXctを継承しないため、うまくいかないようです。これによりエラーは削除されますが、日時が変更されます。

x = data.frame(Index = as.chron(c(15657.00,15657.17)), Var1 = c(1,2), Var2 = c(9,8))
class(x$Index) <- c(class(x$Index),'POSIXct')
y = melt(x,id.vars="Index")

私が言ったように、この種はどこかのバグのようなにおいがします。私のお金は、クラスベクトルにPOSIXctを追加するためのchronの必要性にありますが、間違っている可能性があります。明らかな代替手段は、代わりにPOSIXct日時を使用することです。

于 2013-03-26T16:18:21.733 に答える