旋转更长但关联多个列

问题描述 投票:0回答:1

我有一个以下形式的数据框:

A TCLP_A B TCLP_B
1 0.1 10 10.1
2 0.2 20 20.1

并希望将这一时间延长到

化学 浓度 TCLP
A 1 0.1
A 2 0.2
B 10 10.1
B 20 20.1

我正在努力使用枢纽命令来实现它。

 df %>% pivot_longer(
    cols = c(!starts_with("TCLP_")), 
    names_to = "Chemical", 
    values_to = "Concentration"
    )

已经完成,但我不知道如何正确旋转 TCLP 列。

我想将 TCLP_A 列转换为名称为 A 的化学物质,但名为 TCLP 的列中的值与原始表中的同一行匹配。

r pivot
1个回答
0
投票

我们可以将

A
B
列分开,重命名并绑定它们。

library(tidyverse)

bind_rows(
  A = select(df, Concentration = A, TCLP = TCLP_A),
  B = select(df, Concentration = B, TCLP = TCLP_B),
  .id = "Chemical"
)
#> # A tibble: 4 × 3
#>   Chemical Concentration  TCLP
#>   <chr>            <int> <dbl>
#> 1 A                    1   0.1
#> 2 A                    2   0.2
#> 3 B                   10  10.1
#> 4 B                   20  20.1

我们可以使用

pivot_*()
操作,尽管上面的解决方案是 更简洁。

df |>
  mutate(id = 1:n()) |>
  rename(Concentration_A = A,
         Concentration_B = B) |>
  pivot_longer(-id) |>
  separate(name, c("type", "Chemical"), fill = "left") |>
  replace_na(list(type = "Concentration")) |>
  pivot_wider(names_from = c(type),
              values_from = value) |>
  arrange(Chemical)
#> # A tibble: 4 × 4
#>      id Chemical Concentration  TCLP
#>   <int> <chr>            <dbl> <dbl>
#> 1     1 A                    1   0.1
#> 2     2 A                    2   0.2
#> 3     1 B                   10  10.1
#> 4     2 B                   20  20.1
© www.soinside.com 2019 - 2024. All rights reserved.