我有一个关于 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)
)
我努力实现这样的最终结果:
我曾经通过以下方式完成这项任务:
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)
我很好奇是否有任何方法可以通过一次调用 pivot_longer()
(或与此相关的任何其他函数)从不同的变量创建多个新列。
非常感谢任何帮助! :)
最佳答案
对于要转换为更长格式的列,您需要使命名规则保持一致:
- 第 j 流派 =
Genre_j
- 关于第 j 个流派的第 i 个问题 =
SQi_j
因此,初始名称SQ1_2
应重命名为SQ2_1
,反之亦然。然后分别堆叠Genre
、SQ1
、SQ2
:
library(dplyr)
library(tidyr)
wide %>%
rename_with(~ sub('(\\d)_(\\d)', '\\2_\\1', .x), starts_with('SQ')) %>%
pivot_longer(-1,
names_to = c(".value", "Time"),
names_sep = '_')
# # A tibble: 20 × 5
# ID Time Genre SQ1 SQ2
# <int> <chr> <chr> <int> <int>
# 1 1 1 Sci-Fi 3 5
# 2 1 2 Sci-Fi 2 2
# 3 2 1 Horror 4 1
# 4 2 2 Sci-Fi 3 5
关于r - 具有多个新列的 Pivot_longer(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73150008/