枢转/收集属于一个公用键的多个“交叉”值

时间:2020-06-21 18:09:19

标签: r dataframe tidyr

我有一些奇怪的时间序列数据存储。对于不同的现象eventfoo,可以同时观察到两种值ab。观测是及时的t,属于不同的category(基本上是不同的记录)。

所有内容都以混合宽格式存储如下:

> tibble(category = c("x", "x", "y", "y"), t = c(1:2, 1:2),
  event_a = c(T, T, F, F), event_b = c(T, F, T, F), 
  foo_a = c(1, 2, 3, 4), foo_b = c(10, 20, 30, 40))

# A tibble: 4 x 6
  category     t event_a event_b foo_a foo_b
  <chr>    <int> <lgl>   <lgl>   <dbl> <dbl>
1 x            1 TRUE    TRUE        1    10
2 x            2 TRUE    FALSE       2    20
3 y            1 FALSE   TRUE        3    30
4 y            2 FALSE   FALSE       4    40

现在我想将其转换为长格式,该现象用于用event来索引value的种类,并且foo的值通过{{ 1}} / a

b

我正在寻找使用# A tibble: 8 x 5 category t event value foo <chr> <dbl> <chr> <lgl> <dbl> 1 x 1 a TRUE 1 2 x 1 b TRUE 10 3 x 2 a TRUE 2 4 x 2 b FALSE 20 5 y 1 a FALSE 3 6 y 1 b TRUE 30 7 y 2 a FALSE 4 8 y 2 b FALSE 40 / tidyr和朋友的tidyverse(或至少gather)种解决方案,但无能为力有用,因为结果中有多个值列。我当时正在考虑将pivot_long列拆分为一个联接,但并没有真正成功,而且我还不足以使用SQL来了解那里出了什么问题...

1 个答案:

答案 0 :(得分:2)

这是解决问题的一种复杂方法,但是可以。
这个想法是通过两步来解决多列问题的,其中pivot_longerevent_*中的每一个都使用foo_*。然后bind_cols得到结果。最后,从新列'event'中删除模式event

library(tidyverse)

df1 %>%
  dplyr::select(-starts_with('foo')) %>%
  pivot_longer(
    cols = starts_with('event'),
    names_to = 'event',
    values_to = 'value'
  ) %>%
  bind_cols(
    df1 %>%
    dplyr::select(-starts_with('event')) %>%
    pivot_longer(
      cols = starts_with('foo'),
      values_to = 'foo'
    ) %>%
    dplyr::select(-category, -t, -name)
  ) %>%
  mutate(event = sub('event_', '', event))
## A tibble: 8 x 5
#  category     t event value   foo
#  <chr>    <int> <chr> <lgl> <dbl>
#1 x            1 a     TRUE      1
#2 x            1 b     TRUE     10
#3 x            2 a     TRUE      2
#4 x            2 b     FALSE    20
#5 y            1 a     FALSE     3
#6 y            1 b     TRUE     30
#7 y            2 a     FALSE     4
#8 y            2 b     FALSE    40