如何解决具有不同命名方案的`pivot_longer`操作
我有一个df
格式:
df <- tibble(
id = c(1,2,3),x02val_a = c(0,1,0),x03val_a = c(1,x04val_a = c(0,1),x02val_b = c(0,x03val_b = c(1,3,x04val_b = c(0,2),age02 = c(1,age03 = c(2,4),age04 = c(3,4,5)
)
我想将其整理成整齐的格式,例如:
# A tibble: 9 x 5
id year val_a val_b age
<dbl> <chr> <dbl> <dbl> <dbl>
1 1 02 0 0 1
2 1 03 1 2 2
...
here的答案适用于更简单的命名方案。但是,由于存在真实数据集中的命名方案,所以我很难定义与所有模式匹配的正则表达式。
到目前为止,我的尝试都错过了一个或其他计划。我可以使用变量名在前和年份在后的年份(age02
)或类型和年份在前,名称最后的年份(x02var
),但不能同时抓取。 / p>
是否可以通过a)正则表达式来做到这一点?或b)pivot_longer
调用的某些组合或参数化?
我知道总是有可能像我所描述的here
我试图用彼此内部的两个组来定义正则表达式(因为这些组不是严格顺序的[含义:左,右],这导致我这样做):
df %>%
pivot_longer(-id,names_to = c('.value','year'),names_pattern = '([a-z]+(\\d+)[a-z]+_[a-z])')
解决方法
有点回旋,但是由于名称风格不一致,您可能首先要重命名列以匹配更简单的模式。您的名称中可能包含3条信息,但是(至少在您的示例中)每列中只有2条信息。
相关的部分是:
- 与
"[a-z_]"
的多个连续匹配,该匹配可以在“ x”之后或在2位数字之后。存在的任何一个都将移动到名称的开头; 不存在中的任何一个都不会返回任何内容,也不占用任何空间。 - 2位数字,该数字移到末尾。
使用pivot_longer
的{{1}}选项可以进行参数化,基于此更简洁的模式,您只需一步即可获得列名。应该足够琐碎以根据需要调整图案,例如可以容纳不同数量的数字。
".value"
,
尝试一下。似乎此名称模式有效:
> df %>%
pivot_longer(-id,names_to = c('.value','year','.value'),names_pattern = '([a-z]+)(\\d+)([a-z_]*)')
# A tibble: 9 x 5
id year xval_a xval_b age
<dbl> <chr> <dbl> <dbl> <dbl>
1 1 02 0 0 1
2 1 03 1 1 2
3 1 04 0 0 3
4 2 02 1 2 2
5 2 03 0 3 3
6 2 04 1 1 4
7 3 02 0 0 3
8 3 03 0 0 4
9 3 04 1 2 5
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。