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

标签 r dataframe pivot tidyr reshape

我有一个关于 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_1 Genre_2 SQ1_1 SQ1_2 SQ2_1 SQ2_2 <正文> 1 科幻 科幻 3 5 2 2 2 恐怖 科幻 4 1 3 5

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

<表类="s-表"> <头> 身份证 <次>次 类型 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)

我很好奇是否有任何方法可以通过一次调用 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/

相关文章:

R - 仅按第一个空格分割数据框

r - 将零填充到列表中所有数据框中的一列

R:当维度超过 2 时 reshape 数据框

python - 使用特定条件在 pandas 数据框中创建汇总行

python - 如何计算在 Pandas 中共享唯一字段的行

excel - 在此示例中,SUMPRODUCT 命令如何工作?

r - 从具有嵌套结构的数据帧创建随机样本

r - 分段回归 : davies. 测试返回 p 值 = NA

r - 如何从表 A 中选择其 ID 与表 B 中的行相匹配但其(非 ID)值不同的行?

dataframe - 如何旋转 Spark DataFrame?