【问题标题】:What is wrong with my R codes for transforming a wide data frame into the long format?我将宽数据帧转换为长格式的 R 代码有什么问题?
【发布时间】:2017-12-18 11:02:48
【问题描述】:

我在Rstudio 中运行以下R 代码,目的是将宽数据帧(称为“合并”)转换为长数据帧。

> merged
          Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
2017 (A) 5980 5341 5890 5596 5753 5470 5589 5545 5749 5938 5844 5356
2017 (P) 5762 5275 5733 5411 5406 4954 5464 5536 5805 5819 5903 5630

我在以下输出之后:

  Description    Month    RN
  2017 (A)       Jan      5980
  2017 (P)       Jan      5762
  2017 (A)       Feb      5341
  2017 (P)       Feb      5275
  ...            ...      ...

我尝试了以下方法(但没有成功):

library(reshape2)
merged_long <- melt(data=merged, 
               id.vars="Description", 
               variable.name="Month",
               value.name="RN")

我收到以下错误消息:

Error: id variables not found in data: Description

我做错了什么?

【问题讨论】:

  • 嗯,错误很明显。您的 merged 数据框中没有名为 Description 的变量。看来2017 (A), 2017 (P) 是行名
  • 谢谢,我明白了!

标签: r dataframe transpose reshape2


【解决方案1】:

正如@Sotos 在 cmets 中所指出的,merged 数据集的行名中的数据需要唯一标识熔化数据集中的观察。要在融合数据集中包含行名,请将以下内容添加到您的代码中。

merged$Description <- rownames(merged)

那么您的原始代码应该会产生预期的结果。

library(reshape2)
merged_long <- melt(data=merged, 
               id.vars="Description", 
               variable.name="Month",
               value.name="RN")

【讨论】:

    【解决方案2】:

    考虑到数据的性质,使用melt(as.matrix(...)) 是最简单的。显然,如果您的数据已经是 matrix,请省略 as.matrix 部分。

    melt(as.matrix(mydf))
    

    您可以同时使用setNames重命名列:

    setNames(melt(as.matrix(mydf)), c("Description", "Month", "RN"))
    #    Description Month   RN
    # 1     2017 (A)   Jan 5980
    # 2     2017 (P)   Jan 5762
    # 3     2017 (A)   Feb 5341
    # .........................
    # .........................
    # 23    2017 (A)   Dec 5356
    # 24    2017 (P)   Dec 5630
    

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多