如何一次融化/重塑多列?

How to melt / reshape multiple columns at once?

假设我让四位游客评价他们在法国和西班牙这两个国家的经历,并告诉我他们去那里的年份。我可以像这样将他们的数据放在 table 中:

Tourism_data_current = tibble("Tourist" = c(1:4), "France_Rating" = c(5,3,7,4), "France_Year" = c(2021, 2016, 2018, 2021), "Spain_Rating" = c(4,5,NA,NA), "Spain_Year" = c(2020,2017, NA, NA))

返回:

A tibble: 4 x 5
  Tourist France_Rating France_Year Spain_Rating Spain_Year
    <int>         <dbl>       <dbl>        <dbl>      <dbl>
1       1             5        2021            4       2020
2       2             3        2016            5       2017
3       3             7        2018           NA         NA
4       4             4        2021           NA         NA

现在,如果我决定我希望此数据较长而不是较宽,以便我可以评估评级与年份之间的关系作为国家/地区的函数,我不知道如何进行。

理想的 table 应该是这样的(我假设):

A tibble: 6 x 4
  Tourist Country Tour_Rating Tour_Year
    <dbl> <chr>         <dbl>     <dbl>
1       1 France            5      2021
2       1 Spain             4      2020
3       2 France            3      2016
4       2 Spain             5      2017
5       3 France            7      2018
6       4 France            4      2021

此目标 table 是根据以下代码手动生成的:

Tourism_data_ideal = tibble("Tourist" = c(1,1,2,2,3,4), "Country" = c("France","Spain","France","Spain","France","France"), "Tour_Rating" = c(5,4,3,5,7,4), "Tour_Year" = c(2021,2020,2016,2017,2018,2021))

我假设我会使用 reshape 包的 melt 函数来执行此 table 转换,但我不确定如何正确执行此操作。到目前为止,我的尝试(熔化一个变量的数据,然后再次熔化另一个变量的数据)已经产生了带有两个国家列的 tables,有时法国和西班牙占据同一行 - 所以我知道我做错了.

有没有直接的方法可以继续?

考虑使用 pivot_longer

library(dplyr)
library(tidyr)
library(stringr)
Tourism_data_current %>%
     pivot_longer(cols = -Tourist, names_to = c("Country", ".value"), 
       names_sep="_", values_drop_na = TRUE) %>%
     rename_with(~ str_c('Tour_', .), Rating:Year)

-输出

# A tibble: 6 x 4
  Tourist Country Tour_Rating Tour_Year
    <int> <chr>         <dbl>     <dbl>
1       1 France            5      2021
2       1 Spain             4      2020
3       2 France            3      2016
4       2 Spain             5      2017
5       3 France            7      2018
6       4 France            4      2021