我有一个名为 test
的 tibble
看起来像这样:
date series_id.x value.x series_id.y value.y
<date> <chr> <dbl> <chr> <dbl>
1 2020-08-03 ABC 0.1 ^FHJ 0.078
2 2020-07-27 ABC 0.105 ^FHJ 0.093
3 2020-07-20 ABC 0.12 ^FHJ 0.105
4 2020-07-13 ABC 0.145 ^FHJ 0.125
5 2020-07-06 ABC 0.15 ^FHJ 0.128
6 2020-06-29 ABC 0.15 ^FHJ 0.125
7 2020-06-22 ABC 0.155 ^FHJ 0.14
8 2020-06-15 ABC 0.175 ^FHJ 0.155
9 2020-06-08 ABC 0.17 ^FHJ 0.153
10 2020-06-01 ABC 0.15 ^FHJ 0.128
我试图将此 tibble
转换为更长的数据系列,其中 series_id.x
和 series_id.y
成为 series_id
,而value.x
和value.y
变为value
,date
列基本保持不变(但实际上可以用来进行分组,因为每个日期现在都有两个与之关联的系列,即 series
和 value
)
我已经阅读了谷歌上的 tidyr
旋转指南并尝试了一些排列,但没有一个有效。
通常我得到:
test %>% tidyr::pivot_longer(cols=contains(c("x","y")), names_to="series_id", values_to="value")
test %>% tidyr::pivot_longer(-date, names_to="series_id", values_to="value")
test %>% tidyr::pivot_longer(-date, names_to=c("series_id", "value"), names_pattern="(.)(.)")
test %>% tidyr::pivot_longer(cols = starts_with("series_id"), names="series_id", values="value")
以上都是失败的尝试。我知道我错过了一些东西,但指南中并不清楚我的用例是否可行。
最佳答案
这里,我们可能需要指定分隔符,即.
。默认情况下,它处于正则表达式模式,即 .
可以匹配任何字符,因此我们转义 (\\
)。此外,由于有多组列,请将 names_to
指定为 .value
和列名称的向量
library(dplyr)
library(tidyr)
test %>%
pivot_longer(cols = matches('\\.[xy]'),
names_to = c('.value', '.series_id'), values_to = 'value', names_sep="\\.")
关于r - 多变量 tidyr 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63288072/