对多组列执行pivot_longer()

jmu*_*tua 1 r dataframe dplyr

我陷入了对多组列执行pivot_longer()的困境。这是示例数据集

df <- data.frame(
  id = c(1, 2),
  uid = c("m1", "m2"),
  germ_kg = c(23, 24),
  mineral_kg = c(12, 17),
  perc_germ = c(45, 34),
  perc_mineral = c(78, 10))
Run Code Online (Sandbox Code Playgroud)

我需要输出数据框看起来像这样

out <- df <- data.frame(
  id = c(1, 1, 2, 2),
  uid = c("m1", "m1", "m2", "m2"),
  crop = c("germ", "germ", "mineral", "mineral"),
  kg = c(23, 12, 24, 17),
  perc = c(45, 78, 34, 10))
Run Code Online (Sandbox Code Playgroud)

Ony*_*mbu 5

df %>%
  rename_with(~str_replace(.x,'(.*)_kg', 'kg_\\1')) %>%
  pivot_longer(-c(id, uid), names_to = c('.value', 'crop'), names_sep = '_')

# A tibble: 4 x 5
     id uid   crop       kg  perc
  <dbl> <chr> <chr>   <dbl> <dbl>
1     1 m1    germ       23    45
2     1 m1    mineral    12    78
3     2 m2    germ       24    34
4     2 m2    mineral    17    10
Run Code Online (Sandbox Code Playgroud)

如果您要使用data.table

library(data.table)
melt(setDT(df), c('id', 'uid'), patterns(kg = 'kg', perc = 'perc'))
  id uid variable kg perc
1:  1  m1        1 23   45
2:  2  m2        1 24   34
3:  1  m1        2 12   78
4:  2  m2        2 17   10
Run Code Online (Sandbox Code Playgroud)