Rivot_longer 带有 stub 名称和最后一个下划线

标签 r tidyr

我有以下风格化的宽数据框 df_wide,我想在 R 中对其进行长整形:

df_wide = data.frame(country = c("A", "B"),
                gdp_1999 = c(100, 200),
                gdp_2000 = c(400,500),
                poverty_rate_1999 = c(35,40),
                poverty_rate_2000 = c(10,15),
                inequality_score_gini_1999 = c(20,25),
                inequality_score_gini_2000 = c(40,45)
                )
df_wide
  country gdp_1999 gdp_2000 poverty_rate_1999 poverty_rate_2000 inequality_score_gini_1999 inequality_score_gini_2000
1       A      100      400                35                10                         20                         40
2       B      200      500                40                15                         25                         45

我想使用pivot_longer按国家/地区年份重新调整数据长度,使数据框如下所示:

df_long = data.frame(country = c("A","A","B","B"),
                     year = c(1999,1999,2000,2000),
                     gdp = c(100,400,200,500),
                     poverty_rate = c(35,10,40,15),
                     inequality_score_gini = c(20,40,25,45))
df_long
country year gdp poverty_rate inequality_score_gini
1       A 1999 100           35                    20
2       A 1999 400           10                    40
3       B 2000 200           40                    25
4       B 2000 500           15                    45

我该如何使用pivot_longer做到这一点?请注意,我专门选择了具有不同数量下划线的变量,因为这是相关的 past posts没有为我的数据集提供足够的指导。我能做的最好的事情就是使用常规的reshape,一次 reshape 一个 stub 模式,例如:

library(reshape)
long_data_gdp <- reshape(df_wide, 
                     varying = c("gdp_1999", "gdp_2000"),
                     idvar = "country",
                     direction = "long",
                     sep = "_")

如果正确的答案可以提供两个子答案,我将非常感激:(1)使用 starts_with() 的答案,这样一切都可以通过 stub 名称而不是 names_pattern 来完成code>,因为当存在多个下划线分隔符时,我上面使用 reshape 的尝试会失败(即 poverty_rateinequality_gini_score 不起作用) ; (2) 带有 names_pattern 的答案,但它解释了如何以非regex专家易于理解的方式将最后一个下划线作为分隔符。

最佳答案

这回答了names_pattern方法:

诀窍是使用正则表达式来设置两个组:(1) 所有值变量 (.*) 和 (2) 年份变量 ([0-9] {4})。我们需要使用括号来指定组。

library(tidyverse)

df_wide %>% 
  pivot_longer(cols = !country,
               names_to = c(".value", "year"),
               names_pattern = "^(.*)_([0-9]{4})$")

#> # A tibble: 4 × 5
#>   country year    gdp poverty_rate inequality_score_gini
#>   <chr>   <chr> <dbl>        <dbl>                 <dbl>
#> 1 A       1999    100           35                    20
#> 2 A       2000    400           10                    40
#> 3 B       1999    200           40                    25
#> 4 B       2000    500           15                    45

reprex package 于 2022 年 4 月 30 日创建(v0.3.0)

数据下方:

df_wide <- tribble(~country, ~gdp_1999, ~gdp_2000, ~poverty_rate_1999, ~poverty_rate_2000, ~inequality_score_gini_1999, ~inequality_score_gini_2000,
                   "A",      100,      400,                35,                10,                         20,                         40,
                   "B",      200,      500,                40,                15,                         25,                         45)

关于Rivot_longer 带有 stub 名称和最后一个下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72071594/

相关文章:

r - 在R中用 'separate'(tidyr)拆分数据帧的几列

r - 静默并行::makePSOCKcluster(..., outfile = "")

r - dplyr 总结的变量结果,取决于输出变量命名

r - tidyr 在多列上使用separate_rows

R:将隐式缺失值和组填充到数据的整个时间跨度

r - 使用pivot_longer进行 reshape 时选择组和值集

r - ld : warning: text-based stub file are out of sync. 回退到库文件进行链接

R 警告 "IMKClient Stall detected"

行绑定(bind)嵌套列表中存在的所有 tibbles

r - 如何在 R 中的数据框中拆分列中的因子名称?