Pivot_longer() 具有多个新列

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()(或任何其他函数)从不同的变量创建多个新列。

任何帮助深表感谢!:)

Dar*_*sai 5

您需要使那些要转换为更长格式的列的命名规则保持一致:

\n
    \n
  • j个流派 =Genre_j
  • \n
  • 关于第 j个流派的第i个问题=SQi_j
  • \n
\n

因此,初始名称SQ1_2应重命名为SQ2_1,反之亦然。然后分别堆栈Genre、 :SQ1SQ2

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n