【问题标题】:R cannot melt data.frameR不能融化data.frame
【发布时间】:2013-06-01 05:21:14
【问题描述】:

我有以下data.frame,称为tableMS:

     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

【问题讨论】:

  • 这对我来说很好用。您使用的是哪个 reshape2 版本?
  • 我正在使用 reshape 版本 0.8.4
  • 您应该使用reshape2 而不是reshape。我的是 1.2.2。
  • 但是,这也适用于我使用reshape 0.8.4。嗯。你能发布str(tableMS)的输出吗?
  • 不过还是换成reshape2更好。不要破解过时的坚果。

标签: r melt


【解决方案1】:

它对我有用。我做了以下。

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"))

【讨论】:

  • 这对我不起作用,因为我将 tableMS 生成为更大表的一部分。
  • @Lilith 当您复制并粘贴我的答案时,它应该适合您。很高兴您找到解决方案。
  • @agstudy 我尝试使用reshape2 1.4.2 版重现您的答案,但失败并显示消息 Error in eval(substitute(expr), envir, enclos) : Can' t 融化具有非原子“测量”列的 data.frames
  • @agstudy 这很奇怪。只是为了确保,我打开了一个新的 R GUI 会话(R 3.3.2,Windoes 64 位),复制了您的 5 条语句并最终得到了相同的错误消息。只要ZT没有被强制加入列表,它就可以工作。
  • @agstudy 非常棒。 data.table 将是我的下一次尝试。
【解决方案2】:

我遇到了同样的问题,但原因不同。我收到相同的错误消息“名称与以前的名称不匹配”,但这是由于使用了包 dplyr

原来是known issue with 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"))

最后一个块然后完成而没有错误。

【讨论】:

    【解决方案3】:

    尝试:

    tableMS <- data.frame(tableMS)
    

    然后按照您想要的方式融化 tableMS。

    【讨论】:

      猜你喜欢
      • 2014-05-12
      • 2016-09-23
      • 2021-02-15
      • 2023-04-03
      • 2017-06-29
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多