我有如下所示的示例数据,其中对于一个单位,我有多次治疗,并且每次治疗在周期前后都有多个测量值。我想做一个前后比较,所以我gather, 和spread如下所示以达到所需的输出。
pivot_我的问题是:这可以用一个命令来完成吗?我一直在尝试找出正确构造是否spec可以实现这一目标,但尚未成功。下面是这样的一种尝试。
我想我会接受要么一种让它发挥作用的方法,要么接受一个关于如何或在一般工作中转向的清晰解释spec,以解释为什么这是不可能的。从旋转的小插图中,我想我明白了:
.name当旋转较长时,包含输入表中的唯一列名称.value包含在旋转较长时间时您希望在输出中包含的新列名称但是,我不知道附加列的含义spec或何时需要它们。我希望我spec能理解 的"before"值period应该进入名为 的列before,但显然它不是这样工作的。
library(tidyverse) # tidyr 0.8.99.9000
tbl <- tibble(
obsv_unit = rep(1:2, each = 4),
treatment = rep(c("A", "B"), each = 2, times = 2),
period = rep(c("before", "after"), times = 4),
measure1 = 1:8,
measure2 = 11:18
)
tbl
#> # A tibble: 8 x 5
#> obsv_unit treatment period measure1 measure2
#> <int> <chr> <chr> <int> <int>
#> 1 1 A before 1 11
#> 2 1 A after 2 12
#> 3 1 B before 3 13
#> 4 1 B after 4 14
#> 5 2 A before 5 15
#> 6 2 A after 6 16
#> 7 2 B before 7 17
#> 8 2 B after 8 18
tbl %>%
gather("measure", "value", starts_with("measure")) %>%
spread(period, value)
#> # A tibble: 8 x 5
#> obsv_unit treatment measure after before
#> <int> <chr> <chr> <int> <int>
#> 1 1 A measure1 2 1
#> 2 1 A measure2 12 11
#> 3 1 B measure1 4 3
#> 4 1 B measure2 14 13
#> 5 2 A measure1 6 5
#> 6 2 A measure2 16 15
#> 7 2 B measure1 8 7
#> 8 2 B measure2 18 17
spec <- tibble(
`.name` = c("measure1", "measure2", "measure1", "measure2"),
`.value` = c("before", "before", "after", "after"),
period = c("before", "before", "after", "after")
)
tbl %>% pivot_wider(spec = spec)
#> Expected a vector, not NULL
tbl %>% pivot_longer(spec = spec)
#> Failed to create output due to bad names.
#> Choose another strategy with `names_repair`
Run Code Online (Sandbox Code Playgroud)