r - 在 R 中使用 dplyr、tidyr、reshape2 进行复杂熔化

标签 r dplyr reshape2 tidyr

这个问题在这里已经有了答案:





Combine Multiple Columns Into Tidy Data [duplicate]

(3 个回答)


4年前关闭。




我试图了解“融化”在复杂情况下的工作原理。我已经看到很多关于在非常简单的情况下使用这些包的帖子和博客——但在更困难的情况下却没有。例如:

假设我在数据框中有以下数据:

  CA UNIT      SCP    DATE1    TIME1   DESC1 ENTRIES1  EXITS1  
1 A002 R051 02-00-00 07-27-13 00:00:00 REGULAR  4209603 1443585
2 A002 R051 02-00-00 07-28-13 08:00:00 REGULAR  4210490 1443821
3 A002 R051 02-00-00 07-29-13 16:00:00 REGULAR  4211586 1444302
4 A002 R051 02-00-00 07-30-13 14:01:46   LOGON  4213192 1444700
5 A002 R051 02-00-00 07-30-13 16:00:00 REGULAR  4213333 1444737
6 A002 R051 02-00-00 08-01-13 00:00:00 REGULAR  4215894 1445274`

并继续向右列(抱歉,我无法在代码块中正确格式化):
     `DATE2    TIME2     DESC2 ENTRIES2  EXITS2
1   07-27-13 08:00:00   REGULAR  4209663 1443616 
2   07-28-13 16:00:00   REGULAR  4210775 1443921 
3   07-30-13 00:00:00   REGULAR  4212845 1444369 
4   07-30-13 14:02:18 DOOR OPEN  4213192 1444700 
5   07-31-13 00:00:00   REGULAR  4214345 1444823 
6   08-01-13 08:00:00   REGULAR  4215977 1445362`

我想将其融合到具有以下格式的数据框中:
  CA UNIT      SCP    DATE    TIME        DESC    ENTRIES  EXITS  
1 A002 R051 02-00-00 07-27-13 00:00:00   REGULAR  4209603 1443585
2 A002 R051 02-00-00 07-28-13 08:00:00   REGULAR  4210490 1443821
3 A002 R051 02-00-00 07-29-13 16:00:00   REGULAR  4211586 1444302
4 A002 R051 02-00-00 07-30-13 14:01:46     LOGON  4213192 1444700
5 A002 R051 02-00-00 07-30-13 16:00:00   REGULAR  4213333 1444737
6 A002 R051 02-00-00 08-01-13 00:00:00   REGULAR  4215894 1445274
7 A002 R051 02-00-00 07-27-13 08:00:00   REGULAR  4209663 1443616
8 A002 R051 02-00-00 07-28-13 16:00:00   REGULAR  4210775 1443921 
9 A002 R051 02-00-00 07-30-13 00:00:00   REGULAR  4212845 1444369
10A002 R051 02-00-00 07-30-13 14:02:18 DOOR OPEN  4213192 1444700
11A002 R051 02-00-00 07-31-13 00:00:00   REGULAR  4214345 1444823
12A002 R051 02-00-00 08-01-13 08:00:00   REGULAR  4215977 1445362

这里的挑战是我想要“融化”的列具有不同的数据类型。我阅读的所有帖子都非常简单,并假设所有融化的列都是相同的数据类型,并且会落入很好的键/值对中。这显然不是这里的情况。

我发现另一个帖子表明可以使用统计数据中的“替换”来完成这种重组。我明白了。但是如果 dplyr、reshape2 和 tidyr 不能用于更复杂的现实世界场景,那么真正的用途是什么?

请展示如何使用 tidyr、dplyr 或 reshape2 执行此操作。

先感谢您!

最佳答案

这是 reshape 的选项从基础 R,如果您查看 ?reshape默认分隔符为 .如果您指定 sep"" ,然后它会使用正则表达式来分割列名[A-Za-z][0-9]这很适合你的情况。您可以放弃 timeid如果您不需要它们,则变量:

reshape(df, varying = 4:13, dir = "long", sep = "")

      CA UNIT      SCP time     DATE     TIME     DESC ENTRIES   EXITS id
 1: A002 R051 02-00-00    1 07-27-13 00:00:00  REGULAR 4209603 1443585  1
 2: A002 R051 02-00-00    1 07-28-13 08:00:00  REGULAR 4210490 1443821  2
 3: A002 R051 02-00-00    1 07-29-13 16:00:00  REGULAR 4211586 1444302  3
 4: A002 R051 02-00-00    1 07-30-13 14:01:46    LOGON 4213192 1444700  4
 5: A002 R051 02-00-00    1 07-30-13 16:00:00  REGULAR 4213333 1444737  5
 6: A002 R051 02-00-00    1 08-01-13 00:00:00  REGULAR 4215894 1445274  6
 7: A002 R051 02-00-00    2 07-27-13 08:00:00  REGULAR 4209663 1443616  1
 8: A002 R051 02-00-00    2 07-28-13 16:00:00  REGULAR 4210775 1443921  2
 9: A002 R051 02-00-00    2 07-30-13 00:00:00  REGULAR 4212845 1444369  3
10: A002 R051 02-00-00    2 07-30-13 14:02:18 DOOROPEN 4213192 1444700  4
11: A002 R051 02-00-00    2 07-31-13 00:00:00  REGULAR 4214345 1444823  5
12: A002 R051 02-00-00    2 08-01-13 08:00:00  REGULAR 4215977 1445362  6

关于r - 在 R 中使用 dplyr、tidyr、reshape2 进行复杂熔化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38946921/

相关文章:

r - 在 R 中将分类变量转换为数值

r - cbind 2个具有不同行数的数据帧

r - dplyr 将字符串拆分为逗号分隔的列表

r - 使用 dplyr::mutate() 修改任意列属性

r - 在 R 中将熔化数据帧转换为矩阵

r - 相关矩阵 - tidyrgather v.reshape2melt

c++ - 在 Rcpp(和 RcppArmadillo)中,如何检查 vec 是否包含复数?

r - 使用 R(DBI 包)从 SQL Server 表中删除行

r - 与 reshape 基函数一样,在 reshape2 中使用 timevar 转换数据框?

r - 如何有效地按组聚合多个 data.table 列,一次 N 个,其中 N 是可变的