r-当使用带有多个变量的pivot_langer时,我会丢失常量变量(包括id)



我试图重塑以下

abc2001abc2002xyz2001xyz2002东亚<1><2><5.5>
国家 地区
日本 4.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

最新更新