如何同时向两个方向旋转?

Cal*_*You 5 r tidyr

我有如下所示的示例数据,其中对于一个单位,我有多次治疗,并且每次治疗在周期前后都有多个测量值。我想做一个前后比较,所以我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)

Mic*_*war 3

的目的spec是处理列名称(宽格式)和值(长格式)中具有不规则模式的情况。它仅适用于克服正则表达式+粘合无法指定前后的困难。如果您查看枢轴插图中的示例,您会发现它无法完成任何使用renamemutate和单个枢轴无法完成的事情。

spec从未被提出作为一种同时向两个方向旋转的方法。

总之,您需要同时使用pivot_longerpivot_wider来完成此转换。