我的数据集包含多个场景(S1、S2、S3)的值,这些场景跨越多个年头,链接变量称为link_col.

link_col <- c("A0001", "A0002", "A0003")
S1_ABC_2019 <- c(1000, 300, 5000)
S1_ABC_2020 <- c(1000, 300, 5000)
S1_ABC_2021 <- c(1000, 300, 5000)
S2_ABC_2012 <- c(800, 600, 2000)
S2_ABC_2013 <- c(800, 600, 2000)
S2_ABC_2019 <- c(800, 600, 2000)
S3_ABC_2013 <- c(600, 100, 900)
S3_ABC_2020 <- c(600, 100, 900)
S3_ABC_2021 <- c(600, 100, 900)

data <- data.frame(link_col, S1_ABC_2019, S1_ABC_2020, S1_ABC_2021, S2_ABC_2012,
                   S2_ABC_2013, S2_ABC_2019, S3_ABC_2013, S3_ABC_2020, S3_ABC_2021)

使用dplyr希望通过将这些宽列压缩为方案、年份和值的每一列来对此数据集进行pivot_longer(),以在gggraph中生成数字.这就是我想要的:

    link_col Scenario Year Value
1      A0001       S1 2019  1000
2      A0002       S1 2020   300
3      A0003       S1 2021  5000
4      A0001       S2 2012  1000
5      A0002       S2 2013   300
6      A0003       S2 2019  5000
7      A0001       S3 2013  1000
8      A0002       S3 2020   300
9      A0003       S3 2021  5000
10     A0001       S1 2019   800
11     A0002       S1 2020   600
12     A0003       S2 2013  2000
13     A0001       S2 2019   800
14     A0002       S3 2015   600
15     A0003       S3 2021  2000
16     A0001       S1 2019   800
17     A0002       S1 2020   600
18     A0003       S1 2021  2000
19     A0001       S2 2012   600
20     A0002       S2 2013   100
21     A0003       S2 2019   900
22     A0001       S3 2013   600
23     A0002       S3 2020   100
24     A0003       S3 2021   900
25     A0001       S1 2019   600
26     A0002       S1 2020   100
27     A0003       S2 2013   900
28     A0001       S2 2019  1100
29     A0002       S3 2015   400
30     A0003       S3 2021  4800
31     A0001       S1 2019  1100
32     A0002       S1 2020   400
33     A0003       S1 2021  4800
34     A0001       S2 2012   900
35     A0002       S2 2013   600
36     A0003       S2 2019  2100
37     A0001       S3 2013   900
38     A0002       S3 2020   600
39     A0003       S3 2021  2100
40     A0001       S1 2019   500
41     A0002       S1 2020   200
42     A0003       S2 2013   800
43     A0001       S2 2019   500
44     A0002       S3 2015   200
45     A0003       S3 2021   800

我试过了,但它不起作用,我真的不明白names_pattern参数的用法.如有任何帮助,我们将不胜感激!

data2 <- pivot_longer(data, 
                      cols = link_col, starts_with("S"),
                      names_to = c("Scenario", "Year"),
                      names_pattern = "S(\\d+)_ABC_2(\\d+)",
                      values_to = Value)

推荐答案

你已经很接近了:

library(tidyr)
pivot_longer(data, cols = -link_col,
             names_pattern = "(S\\d+)_ABC_(2\\d+)",
             names_to = c("Scenario", "Year"),
             values_to = "Value")

输出

# # A tibble: 27 × 4
#    link_col Scenario Year  Value
#    <chr>    <chr>    <chr> <dbl>
#  1 A0001    S1       2019   1000
#  2 A0001    S1       2020   1000
#  3 A0001    S1       2021   1000
#  4 A0001    S2       2012    800
#  5 A0001    S2       2013    800
#  6 A0001    S2       2019    800
#  7 A0001    S3       2013    600
#  8 A0001    S3       2020    600
#  9 A0001    S3       2021    600
# 10 A0002    S1       2019    300
# # ℹ 17 more rows
# # ℹ Use `print(n = ...)` to see more rows

以下是一些解释:

  • names_pattern中,括号用于捕获组,names_to将命名这些组.您需要一个组用于场景,这是通过包括"S"来捕获的,而您的第二个组用于年份.
  • cols参数需要将所有列都转换为更长的格式,所以这里的参数是除link_col之外的所有列.

R相关问答推荐

R dðr按时间间隔进行总结

for循环和if else在R中

NA仅省略具有NA的 Select 行

想要创建一个可以存储四个多元正态总体的多元偏度的载体

给定R中另一行中的值,如何插补缺失值

变量计算按R中的行更改

如何计算R数据集中每个女性的子元素数量?

制作等距离的线串副本

将多列合并为单独的名称—值对

无法正确设置动态创建的Quarto标注的格式

try 将 colored颜色 编码添加到ggploly的标题中

从R中的对数正态分布生成随机数的正确方法

QY数据的处理:如何定义QY因素的水平

停止ggplot将多行减少到一行

使用R将简单的JSON解析为嵌套框架

在R中使用列表(作为tibble列)进行向量化?

使用gt_summary是否有一种方法来限制每个变量集进行配对比较?

使用来自嵌套列和非嵌套列的输入的PURRR:MAP和dplyr::Mariate

ggplot R:X,Y,Z使用固定/等距的X,Y坐标绘制六边形热图

使用列中的值来调用函数调用中应使用的其他列