我试图重塑以下
国家 | 地区 | abc2001abc2002xyz2001xyz2002|
---|---|---|
日本 | 东亚<1><2> | 4.5 | <5.5>
我们可以更改正则表达式模式,将一个或多个非数字(\D+
(匹配为第一个捕获组,将一或多个数字(\d+
(匹配为第二个
librarytidyr)
pivot_longer(data, cols = c(-country, -region),
names_to = c(".value", "year"), names_pattern = "(\D+)(\d+)")
-输出
# A tibble: 2 × 5
country region year abc xyz
<chr> <chr> <chr> <int> <dbl>
1 Japan East Asia 2001 1 4.5
2 Japan East Asia 2002 2 5.5
数据
data <- structure(list(country = "Japan", region = "East Asia", abc2001 = 1L,
abc2002 = 2L, xyz2001 = 4.5, xyz2002 = 5.5),
class = "data.frame", row.names = c(NA,
-1L))
更新:如@akrun所述,请参阅注释,这里有更好的带有查找功能的正则表达式:
rename_with(., ~str_replace(names(data), "(?<=\D)(?=\d)", "\_"))
第一个答案:
这是一个带有names_sep
的版本。挑战在于在列名中添加下划线首选答案是@akrun:
(.*)
-组1:尽可能多的任何零个或多个字符(\d{4}$)
-第2组:用于末尾的数字
library(dplyr)
library(tidyr)
data %>%
rename_with(., ~sub("(.*)(\d{4}$)", "\1_\2", names(data))) %>%
pivot_longer(-c(country, region),
names_to =c(".value","Year"),
names_sep ="_"
)
country region Year abc xyz
<chr> <chr> <chr> <int> <dbl>
1 Japan East Asia 2001 1 4.5
2 Japan East Asia 2002 2 5.5