gpt4 book ai didi

r - 具有多个新列的 Pivot_longer()

转载 作者:行者123 更新时间:2023-12-05 01:50:24 25 4
gpt4 key购买 nike

我有一个关于 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)
)
<表类="s-表"><头>身份证Genre_1Genre_2SQ1_1SQ1_2SQ2_1SQ2_2<正文>1科幻科幻35222恐怖科幻4135

我努力实现这样的最终结果:

<表类="s-表"><头>身份证<次>次 类型SQ1SQ2<正文>1类型_1科幻351类型_2科幻222类型_1恐怖412类型_2科幻35

我曾经通过以下方式完成这项任务:

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,反之亦然。然后分别堆叠GenreSQ1SQ2:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com