我喜欢重塑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"))
)
3条答案
按热度按时间acruukt91#
你的
gather
行应该看起来像这样:这表示“收集除
teacher
和pd
之外的所有变量,将新的键列称为'variable',将新的值列称为'date'”。作为解释,请注意
help(gather)
页面中的以下内容:由于这是一个省略号,要收集的列的规范作为单独的(裸名称)参数给出。我们希望收集除
teacher
和pd
之外的所有列,因此我们使用-
。aor9mmx12#
在tidyr 1.0.0中,这个任务是通过更灵活的
pivot_longer()
来完成的。等效语法为
相应地,它表示“将除了
teacher
和pd
之外的所有内容都旋转得更长,将新变量列称为“variable”,将新值列称为“date”。请注意,长数据首先按照前一个 Dataframe 中被透视的列的顺序返回,这与
gather
不同,gather
按照新变量列的顺序返回。要重新排列生成的tibble,请使用dplyr::arrange()
。nhaq1z213#
我的解决方案