web-dev-qa-db-ja.com

Rはdata.frameを溶かすことができません

TableMSと呼ばれる次のdata.frameがあります。

     X   Y        Z        T
1  375 855 455.7259 3777.856
2  395 969 347.8306   2506.7
3  449 811 309.9512 519.8513
4  451 774  278.291 717.8705
5  453 774  278.291 717.8705
6  455 774  278.291 717.8705
7  521 697  376.734 693.8541
8  529 855 455.7259 3777.856
9  531 855 455.7259 3777.856
10 609 774  278.291 717.8705

関数melt()を使おうとすると

MeltTable <- melt(tableMS,id=c("X","Y"))

次のエラーが発生します。

Error in match.names(clabs, names(xi)) : 
   names do not match previous names

私は何が起こるかを理解するのに苦労しています、何か考えはありますか?

編集:より大きなテーブルの一部としてtableMSを生成しましたが、str(tableMS)の出力は次のとおりです。

'data.frame':   10 obs. of  4 variables:
$ X: num  375 395 449 451 453 455 521 529 531 609
$ Y: num  855 969 811 774 774 774 697 855 855 774
$ Z:List of 10
  ..$ : num 456
  ..$ : num 348
  ..$ : num 310
  ..$ : num 278
  ..$ : num 278
  ..$ : num 278
  ..$ : num 377
  ..$ : num 456
  ..$ : num 456
  ..$ : num 278
$ T:List of 10
  ..$ : num 3778
  ..$ : num 2507
  ..$ : num 520
  ..$ : num 718
  ..$ : num 718
  ..$ : num 718
  ..$ : num 694
  ..$ : num 3778
  ..$ : num 3778
  ..$ : num 718
12
Claudia

わたしにはできる。私は次のことをしました。

library(reshape2)
tableMS <- read.table(text='     X   Y        Z        T
1  375 855 455.7259 3777.856
2  395 969 347.8306   2506.7
3  449 811 309.9512 519.8513
4  451 774  278.291 717.8705
5  453 774  278.291 717.8705
6  455 774  278.291 717.8705
7  521 697  376.734 693.8541
8  529 855 455.7259 3777.856
9  531 855 455.7259 3777.856
10 609 774  278.291 717.8705',header=TRUE)

[〜#〜] edit [〜#〜]これは、ZTをリストに強制変換しても機能します。

tableMS$Z <- as.list(tableMS$Z)
tableMS$T <- as.list(tableMS$T)


MeltTable <- melt(tableMS,id=c("X","Y"))
# MeltTable
# X   Y variable     value
# 1  375 855        Z  455.7259
# 2  395 969        Z  347.8306
# 3  449 811        Z  309.9512
# 4  451 774        Z  278.2910
# 5  453 774        Z  278.2910
# 6  455 774        Z  278.2910
# 7  521 697        Z  376.7340
# 8  529 855        Z  455.7259
# 9  531 855        Z  455.7259
# 10 609 774        Z  278.2910
# 11 375 855        T 3777.8560
# 12 395 969        T 2506.7000
# 13 449 811        T  519.8513
# 14 451 774        T  717.8705
# 15 453 774        T  717.8705
# 16 455 774        T  717.8705
# 17 521 697        T  693.8541
# 18 529 855        T 3777.8560
# 19 531 855        T 3777.8560
# 20 609 774        T  717.8705

編集はreshape2バージョン1.4.2では機能しません

回避策は、data.tableパッケージを使用することです。ところで、このソリューションはより高速です。

library(data.table)
tableMS$Z <- as.vector(as.list(tableMS$Z))
tableMS$T <- as.vector(as.list(tableMS$T))
setDT(tableMS)
melt(tableMS,id=c("X","Y"))
3
agstudy

私も同じ問題を抱えていましたが、原因は異なりました。 「名前が以前の名前と一致しません」という同じエラーメッセージが表示されましたが、パッケージdplyrを使用したことが原因でした。

結局のところ、それは dplyrの既知の問題 です。 GitHubの問題によると、dplyrとreshapeの一部のバージョンで発生しますが、他のバージョンでは発生しません。

dplyrからの出力は、単なるdata.frameではなく、data.frameから継承します。したがって、dplyrを使用してdataを生成した後、次の結果が得られます。

class(data)

> [1] "tbl_df"     "tbl"        "data.frame"

melt(data, id = c("X", Y"))

>Error in match.names(clabs, names(xi)) : 
names do not match previous names

この問題を修正するには、dplyr出力をデータフレームに変換する必要がありました。これは、これらのパッケージを組み合わせるための推奨される方法でもあるようです。

data <- as.data.frame(data)
class(data)

> [1] "data.frame"

melt(data, id = c("X", "Y"))

その後、最後のブロックはエラーなしで完了します。

34
Alex A.

試してください:

tableMS <- data.frame(tableMS)

次に、tableMSを希望どおりに溶かします。

0
Kristin