私はこれが古い質問であり、多くの関心を生み出す可能性が低いことを知っています。また、例で示したとおりに実行している理由もよくわかりません。それにもかかわらず、答えを要約すると、次のいずれかです。
- 再び「溶ける」前にあなた
df.cast
を包んでください。as.data.frame
- 「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