You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中将复杂宽长混合数据集转换为值与范围两类长格式数据集

解决方案:将混合宽长数据集转换为长格式值/范围数据集

步骤1:加载依赖包

使用tidyverse工具链处理数据:

library(tidyverse)

步骤2:修复复合表头并清洗数据

原始数据的表头分为两行(地区+指标类型),先合并表头,再填充类别并过滤无效行:

# 提取前两行生成复合表头
header_rows <- df1[1:2, ]
col_names <- map2_chr(header_rows[1, ], header_rows[2, ], function(area, type) {
  if(type == "" || is.na(type)) area else paste(area, type, sep = " - ")
})
col_names[3] <- "Notes" # 保留Notes列原名

# 清洗数据:设置新列名、填充类别、过滤分隔行
df_clean <- df1[-c(1,2), ] %>%
  set_names(col_names) %>%
  mutate(Category = `Canada > London`, .before = 1) %>%
  fill(Category, .direction = "down") %>%
  filter(Category != `Canada > London`)

步骤3:转换为长格式并拆分数据集

通过pivot_longer转长格式,再按指标类型拆分出值数据集(Price)和范围数据集(Range):

# 转长格式
df_long <- df_clean %>%
  pivot_longer(
    cols = starts_with("Canada") | starts_with("United Kingdom"),
    names_to = c("Location", "Metric"),
    names_sep = " - ",
    values_to = "Value"
  ) %>%
  drop_na(Value)

# 生成值数据集(Price)
value_df <- df_long %>%
  filter(Metric == "Price") %>%
  select(Category, Item = `Canada > London`, Location, Price = Value) %>%
  mutate(Price = as.numeric(Price))

# 生成范围数据集(Range)
range_df <- df_long %>%
  filter(Metric == "Range") %>%
  select(Category, Item = `Canada > London`, Location, Range = Value)

最终结果示例

值数据集(value_df):

value_df
#> # A tibble: 8 × 4
#>   Category     Item        Location               Price
#>   <chr>        <chr>       <chr>                  <dbl>
#> 1 Restaurant   Fried beef  Canada > London          27
#> 2 Restaurant   Fried beef  United Kingdom > London  29
#> 3 Restaurant   Fried potato Canada > London          5
#> 4 Restaurant   Fried potato United Kingdom > London  8
#> 5 Bar          Beer Lager  Canada > London           5
#> 6 Bar          Beer Lager  United Kingdom > London   6
#> 7 Bar          Beer Dark   Canada > London           4
#> 8 Bar          Beer Dark   United Kingdom > London   5

范围数据集(range_df):

range_df
#> # A tibble: 8 × 4
#>   Category     Item        Location               Range  
#>   <chr>        <chr>       <chr>                  <chr>  
#> 1 Restaurant   Fried beef  Canada > London        25-30  
#> 2 Restaurant   Fried beef  United Kingdom > London 25 - 35
#> 3 Restaurant   Fried potato Canada > London        3 - 8  
#> 4 Restaurant   Fried potato United Kingdom > London 3 - 8  
#> 5 Bar          Beer Lager  Canada > London         4 - 8  
#> 6 Bar          Beer Lager  United Kingdom > London 4 - 8  
#> 7 Bar          Beer Dark   Canada > London         3 - 7  
#> 8 Bar          Beer Dark   United Kingdom > London 3 - 7

内容的提问来源于stack exchange,提问作者Alexander Shemetev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:40:38