比较聚集(tidyr)与熔化(reshape2)

ao218c7q  于 2023-05-04  发布在  其他
关注(0)|答案(3)|浏览(117)

我喜欢重塑2包,因为它让生活变得如此简单。通常,Hadley在他以前的包中进行了改进,使代码能够更快地运行。我想我会给予tidyr一个旋转,从我所读到的,我认为gather非常类似于shape2中的melt。但是在阅读了文档之后,我无法让gather执行与melt相同的任务。

数据视图

下面是数据的视图(实际数据在文章末尾的dput中):

teacher yr1.baseline     pd yr1.lesson1 yr1.lesson2 yr2.lesson1 yr2.lesson2 yr2.lesson3
1       3      1/13/09 2/5/09      3/6/09     4/27/09     10/7/09    11/18/09      3/4/10
2       7      1/15/09 2/5/09      3/3/09      5/5/09    10/16/09    11/18/09      3/4/10
3       8      1/27/09 2/5/09      3/3/09     4/27/09     10/7/09    11/18/09      3/5/10

编码

下面是以melt方式编写的代码,这是我对gather的尝试。如何让gather做与melt相同的事情?

library(reshape2); library(dplyr); library(tidyr)

dat %>% 
   melt(id=c("teacher", "pd"), value.name="date") 

dat %>% 
   gather(key=c(teacher, pd), value=date, -c(teacher, pd))

期望输出

teacher     pd     variable     date
1        3 2/5/09 yr1.baseline  1/13/09
2        7 2/5/09 yr1.baseline  1/15/09
3        8 2/5/09 yr1.baseline  1/27/09
4        3 2/5/09  yr1.lesson1   3/6/09
5        7 2/5/09  yr1.lesson1   3/3/09
6        8 2/5/09  yr1.lesson1   3/3/09
7        3 2/5/09  yr1.lesson2  4/27/09
8        7 2/5/09  yr1.lesson2   5/5/09
9        8 2/5/09  yr1.lesson2  4/27/09
10       3 2/5/09  yr2.lesson1  10/7/09
11       7 2/5/09  yr2.lesson1 10/16/09
12       8 2/5/09  yr2.lesson1  10/7/09
13       3 2/5/09  yr2.lesson2 11/18/09
14       7 2/5/09  yr2.lesson2 11/18/09
15       8 2/5/09  yr2.lesson2 11/18/09
16       3 2/5/09  yr2.lesson3   3/4/10
17       7 2/5/09  yr2.lesson3   3/4/10
18       8 2/5/09  yr2.lesson3   3/5/10

数据

dat <- data.frame(
  teacher = factor(c("3", "7", "8")),
  yr1.baseline = factor(c("1/13/09", "1/15/09", "1/27/09")),
  pd = factor(c("2/5/09", "2/5/09", "2/5/09")),
  yr1.lesson1 = factor(c("3/6/09", "3/3/09", "3/3/09")),
  yr1.lesson2 = factor(c("4/27/09", "5/5/09", "4/27/09")),
  yr2.lesson1 = factor(c("10/7/09", "10/16/09", "10/7/09")),
  yr2.lesson2 = factor(c("11/18/09", "11/18/09", "11/18/09")),
  yr2.lesson3 = factor(c("3/4/10", "3/4/10", "3/5/10"))
)
acruukt9

acruukt91#

你的gather行应该看起来像这样:

dat %>% gather(variable, date, -teacher, -pd)

这表示“收集除teacherpd之外的所有变量,将新的键列称为'variable',将新的值列称为'date'”。
作为解释,请注意help(gather)页面中的以下内容:

...: Specification of columns to gather. Use bare variable names.
      Select all variables between x and z with ‘x:z’, exclude y
      with ‘-y’. For more options, see the select documentation.

由于这是一个省略号,要收集的列的规范作为单独的(裸名称)参数给出。我们希望收集除teacherpd之外的所有列,因此我们使用-

aor9mmx1

aor9mmx12#

在tidyr 1.0.0中,这个任务是通过更灵活的pivot_longer()来完成的。
等效语法为

library(tidyr)
dat %>% pivot_longer(cols = -c(teacher, pd), names_to = "variable", values_to = "date")

相应地,它表示“将除了teacherpd之外的所有内容都旋转得更长,将新变量列称为“variable”,将新值列称为“date”。
请注意,长数据首先按照前一个 Dataframe 中被透视的列的顺序返回,这与gather不同,gather按照新变量列的顺序返回。要重新排列生成的tibble,请使用dplyr::arrange()

nhaq1z21

nhaq1z213#

我的解决方案

dat%>%
    gather(!c(teacher,pd),key=variable,value=date)

相关问题