我有一些奇怪的时间序列数据存储。对于不同的现象event
和foo
,可以同时观察到两种值a
和b
。观测是及时的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来了解那里出了什么问题...
答案 0 :(得分:2)
这是解决问题的一种复杂方法,但是可以。
这个想法是通过两步来解决多列问题的,其中pivot_longer
和event_*
中的每一个都使用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