Til*_*aum 3 pivot r reshape dataframe tidyr
我有一个关于 的问题tidyr::pivot_longer()。
假设我从一个虚构的数据框开始。想象一下人们被问到关于两种类型的两个问题。SQ1_2 将是关于第一种类型的第二个问题。
set.seed(1234)
genres <- c("Crime", "Horror", "Love", "Sci-Fi", NA)
wide <- data.frame(
ID = 1:10,
Genre_1 = sample(genres, 10, replace = TRUE),
Genre_2 = sample(genres, 10, replace = TRUE),
SQ1_1 = sample(1:5, 10, replace = TRUE),
SQ1_2 = sample(1:5, 10, replace = TRUE),
SQ2_1 = sample(1:5, 10, replace = TRUE),
SQ2_2 = sample(1:5, 10, replace = TRUE)
)
Run Code Online (Sandbox Code Playgroud)
| ID | 流派_1 | 流派_2 | SQ1_1 | SQ1_2 | SQ2_1 | SQ2_2 |
|---|---|---|---|---|---|---|
| 1 | 科幻 | 科幻 | 3 | 5 | 2 | 2 |
| 2 | 恐怖 | 科幻 | 4 | 1 | 3 | 5 |
我努力实现这样的最终结果:
| ID | 时间 | 类型 | SQ1 | SQ2 |
|---|---|---|---|---|
| 1 | 流派_1 | 科幻 | 3 | 5 |
| 1 | 流派_2 | 科幻 | 2 | 2 |
| 2 | 流派_1 | 恐怖 | 4 | 1 |
| 2 | 流派_2 | 科幻 | 3 | 5 |
我曾经通过以下方式完成此任务:
long1 <- wide |> tidyr::pivot_longer(col = starts_with("Genre"),
names_to = "time",
values_to = "genre")
long2 <- wide |> tidyr::pivot_longer(col = c(SQ1_1, SQ2_1),
names_to = "time",
values_to = "SQ1")
long3 <- wide |> tidyr::pivot_longer(col = c(SQ1_2, SQ2_2),
names_to = "time",
values_to = "SQ2")
long <- long1 |>
dplyr::select(ID, time:genre) |>
dplyr::mutate(SQ1 = long2$SQ1,
SQ2 = long3$SQ2)
Run Code Online (Sandbox Code Playgroud)
我只是好奇是否有任何方法可以通过一次调用pivot_longer()(或任何其他函数)从不同的变量创建多个新列。
任何帮助深表感谢!:)
您需要使那些要转换为更长格式的列的命名规则保持一致:
\nGenre_jSQi_j因此,初始名称SQ1_2应重命名为SQ2_1,反之亦然。然后分别堆栈Genre、 :SQ1SQ2
library(dplyr)\nlibrary(tidyr)\n\nwide %>%\n rename_with(~ sub(\'(\\\\d)_(\\\\d)\', \'\\\\2_\\\\1\', .x), starts_with(\'SQ\')) %>%\n pivot_longer(-1,\n names_to = c(".value", "Time"),\n names_sep = \'_\')\n\n# # A tibble: 20 \xc3\x97 5\n# ID Time Genre SQ1 SQ2\n# <int> <chr> <chr> <int> <int>\n# 1 1 1 Sci-Fi 3 5\n# 2 1 2 Sci-Fi 2 2\n# 3 2 1 Horror 4 1\n# 4 2 2 Sci-Fi 3 5\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |