1

パッケージ内cast/meltからの奇妙な動作に遭遇しました。reshapeをキャストしてdata.frameから試してみるとmeltmeltが間違って出てきます。キャストから「df.melt」クラスを手動で設定解除すると、data.frame適切に溶解されます。

これが意図した動作であるかどうかを誰かが知っていますか?もしそうなら、あなたがそれを望むときのユースケースは何ですか?

動作を示す小さなコード例:

> df <- data.frame(type=c(1, 1, 2, 2, 3, 3), variable="n", value=c(71, 72, 68, 80, 21, 20))

> df
  type variable value
1    1        n    71
2    1        n    72
3    2        n    68
4    2        n    80
5    3        n    21
6    3        n    20

> df.cast <- cast(df, type~., sum)
> names(df.cast)[2] <- "n"

> df.cast
  type   n
1    1 143
2    2 148
3    3  41

> class(df.cast)
[1] "cast_df"    "data.frame"

> melt(df.cast, id="type", measure="n")
         type value value
X.all.      1   143 (all)
X.all..1    2   148 (all)
X.all..2    3    41 (all)

> class(df.cast) <- "data.frame"
> class(df.cast)
[1] "data.frame"

> melt(df.cast, id="type", measure="n")
  type variable value
1    1        n   143
2    2        n   148
3    3        n    41
4

2 に答える 2

2

私はこれが古い質問であり、多くの関心を生み出す可能性が低いことを知っています。また、例で示したとおりに実行している理由もよくわかりません。それにもかかわらず、答えを要約すると、次のいずれかです。

  1. 再び「溶ける」前にあなたdf.castを包んでください。as.data.frame
  2. 「reshape」を捨てて「reshape2」にアップデートします。この質問は「reshape2」のバージョン1より約半年前のものであるため、この質問を投稿したときには当てはまりませんでした。

これがより長いウォークトラフです:

まず、「reshape」と「reshape2」をロードし、「casting」を実行して、「n」変数の名前を変更します。明らかに、「R2」が追加されたオブジェクトは、「reshape2」からのオブジェクトであり、「R1」は「reshape」からのものです。

library(reshape)
library(reshape2)
df.cast.R2 <- dcast(df, type~., sum)
df.cast.R1 <- cast(df, type~., sum)
names(df.cast.R1)[2] <- "n"
names(df.cast.R2)[2] <- "n"

次に、私たちが今持っているものを簡単に見てみましょう:

class(df.cast.R1)
# [1] "cast_df"    "data.frame"
class(df.cast.R2) 
[1] "data.frame"
str(df.cast.R1) 
# List of 2
#  $ type: num [1:3] 1 2 3
#  $ n   : num [1:3] 143 148 41
#  - attr(*, "row.names")= int [1:3] 1 2 3
#  - attr(*, "idvars")= chr "type"
#  - attr(*, "rdimnames")=List of 2
#   ..$ :'data.frame':  3 obs. of  1 variable:
#   .. ..$ type: num [1:3] 1 2 3
#   ..$ :'data.frame':  1 obs. of  1 variable:
#   .. ..$ value: Factor w/ 1 level "(all)": 1
str(df.cast.R2)
# 'data.frame':  3 obs. of  2 variables:
#  $ type: num  1 2 3
#  $ n   : num  143 148 41

いくつかの観察結果は明らかです。

  • の出力を見ると、「reshape2」を使用している場合は、実行しようとしていることを問題なくclass実行できると推測できます。
  • うわあ。その出力は、私が今まで見た中str(df.cast.R1)で最も奇妙に見えるものです!data.frame実際には、そこに2つの単一変数があるように見えますdata.frame

classこの新しい知識と、キャストのを変更したくないという前提条件で、次にdata.frame進みましょう。

# You don't want this
melt(df.cast.R1, id="type", measure="n") 
#          type value value
# X.all.      1   143 (all)
# X.all..1    2   148 (all)
# X.all..2    3    41 (all)

# You *do* want this
melt(as.data.frame(df.cast.R1), id="type", measure="n")
#   type variable value
# 1    1        n   143
# 2    2        n   148
# 3    3        n    41

# And the class has not bee altered
class(df.cast.R1)
# [1] "cast_df"    "data.frame"

# As predicted, this works too.
melt(df.cast.R2, id="type", measure="n")
#   type variable value
# 1    1        n   143
# 2    2        n   148
# 3    3        n    41

「reshape」からまだ作業している場合はcast、「reshape2」にアップグレードすることを検討するか、便利なラッパー関数を作成してくださいmelt...おそらくmelt2

melt2 <- function(data, ...) {
  ifelse(isTRUE("cast_df" %in% class(data)), 
         data <- as.data.frame(data), 
         data <- data)
  melt(data, ...)
}

試してみてくださいdf.cast.R1

melt2(df.cast.R, id="type", measure="n")
#    ype variable value
# 1    1        n   143
# 2    2        n   148
# 3    3        n    41
于 2013-01-28T08:20:18.817 に答える
1

キャストする前に、データ フレームを溶かす必要があります。reshape はデータの構造を推測する必要があるため、最初に溶解せずにキャストすると、あらゆる種類の予期しない動作が発生します。

于 2011-05-11T19:17:02.053 に答える