我有一个以下形式的数据框:
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 的列中的值与原始表中的同一行匹配。
我们可以将
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