【问题标题】:Problems converting from wide to long using reshape - tibble issue? [duplicate]使用 reshape 从宽到长转换的问题 - tibble 问题? [复制]
【发布时间】:2017-04-05 10:09:36
【问题描述】:

我正在尝试将我的数据从宽转换为长。我有一个 id 变量和 131 列时间数据。所有列都是整数格式。数据以csv格式导入。

> class(ECGHR)
[1] "tbl_df"     "tbl"        "data.frame"

以下是 22 个时变变量的前 6 行数据:

> head (ECGHR)
# A tibble: 6 × 132
 id    T0    T1    T2    T3    T4    T5    T6    T7    T8    T9   T10   T11  T12   T13   T14   T15   T16   T17   T18   T19   T20   T21   T22
<int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1  2003    70    65    69    71    68    74    67    65    60    66    59    99    74    73    87    94    88    88    98    73    72    63    79
2  2004    98   105    85    87    83    83    77    71    75    73    73    71    87    74    79    75    72    71    71    68    86    72    73
3  2008    93    92    91    90    93    88    89    83    93    96    95    94    89    91    87    93    88   100    93    92    89    93    83
4  2010    71    69    74    71    74    68    74    68    78    75    81    72    74    77    74    70    64    68    65    69    66    73    75
5  2018    90    86    93    91    86    82    97    95    95    83    79    88    78    92    86    94    83    79    96    91    72    78    80
6  2019    60    58    59    58    66    68    73    77    58   110    56    56    53    49    73    56    45    50    46    45    46    54    50

这是我的重塑代码:

ECGHR_long=reshape(ECGHR, varying=c(2:132), direction="long", idvar="id", sep="")

这是警告信息:

'row.namestmp', value = paste(d[, idvar], times[1L], : invalid 'row.names' length 另外:警告信息: 不推荐在 tibble 上设置行名。

我习惯于使用数据框,但我不知道为什么它不会重塑(我是 R 新手)。我需要将其转换为数据帧吗?如果有任何见解,我将不胜感激!

【问题讨论】:

  • tidyr 包中的 gatherreshape 的作用相同,但我发现它使用起来更直观。在这种情况下ECGHR_long &lt;- ECGHR %&gt;% gather(key="T",value="value",-id)
  • 谢谢!效果很好。

标签: r reshape


【解决方案1】:

要在 R 的基础中使用reshape 函数,试试这个——我们省略了idvar="id",因为它可以自己计算出来,但如果你添加它不会有什么坏处。

reshape(as.data.frame(ECGHR), dir = "long", varying = list(2:ncol(ECGHR)),
  times = names(ECGHR)[-1])
##           id time T0
## 2003.T0 2003   T0 70
## 2004.T0 2004   T0 98
## 2008.T0 2008   T0 93
## 2010.T0 2010   T0 71
## 2018.T0 2018   T0 90
## 2019.T0 2019   T0 60
## etc.

或使用 reshape2 包:

library(reshape2)
melt(ECGHR, id.vars = 1)

##     id variable value
## 1 2003       T0    70
## 2 2004       T0    98
## 3 2008       T0    93
## 4 2010       T0    71
## 5 2018       T0    90
## 6 2019       T0    60

注意:我们使用了这个输入:

Lines <- "id    T0    T1    T2    T3    T4    T5    T6    T7    T8    T9   T10   T11  T12   T13   T14   T15   T16   T17   T18   T19   T20   T21   T22
1  2003    70    65    69    71    68    74    67    65    60    66    59    99    74    73    87    94    88    88    98    73    72    63    79
2  2004    98   105    85    87    83    83    77    71    75    73    73    71    87    74    79    75    72    71    71    68    86    72    73
3  2008    93    92    91    90    93    88    89    83    93    96    95    94    89    91    87    93    88   100    93    92    89    93    83
4  2010    71    69    74    71    74    68    74    68    78    75    81    72    74    77    74    70    64    68    65    69    66    73    75
5  2018    90    86    93    91    86    82    97    95    95    83    79    88    78    92    86    94    83    79    96    91    72    78    80
6  2019    60    58    59    58    66    68    73    77    58   110    56    56    53    49    73    56    45    50    46    45    46    54    50"

ECGHR <- read.table(text = Lines, header = TRUE)

【讨论】:

  • 感谢您的建议。当我使用 reshape 时,我收到了与我的问题中发布的相同的错误消息。
  • 尝试用as.data.frame(ECGHR) 替换ECGHR,以防reshape 不喜欢小标题——根据答案中的修改代码。无论如何,我的答案中的代码在应用于注释中的输入时有效,正如您从生成的输出中看到的那样,请尝试确定有什么不同。
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2015-02-03
相关资源
最近更新 更多