【问题标题】:How to melt / reshape multiple columns at once? [duplicate]如何一次熔化/重塑多个列? [复制]
【发布时间】:2021-10-05 11:15:26
【问题描述】:

想象一下,我请四位游客评价他们在法国和西班牙这两个国家的经历,并告诉我他们去那里的年份。我可以将他们的数据放在这样的表格中:

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

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

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

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

此目标表是通过以下代码手动生成的:

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 函数来做这个表格转换,但我不知道如何正确地做到这一点。到目前为止,我的尝试(融合一个变量的数据,然后再融合另一个变量)生成了包含两个 Country 列的表格,有时法国和西班牙占据同一行 - 所以我知道我做错了。

是否有直接的方法来处理?

【问题讨论】:

标签: r reshape


【解决方案1】:

考虑使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2012-12-20
    相关资源
    最近更新 更多