如何一次融化/重塑多列?
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
假设我让四位游客评价他们在法国和西班牙这两个国家的经历,并告诉我他们去那里的年份。我可以像这样将他们的数据放在 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