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

在R中如何将数据框转换为以日期为列名的指定格式?

R数据框指定格式重塑解决方案

原始数据

df <- data.frame(
  date = c("2023-01-01", "2023-01-01", "2023-01-02", "2023-01-03"),
  price = c(94.30076, 95.58771, 102.78559, 93.29053),
  num_floors = c(3, 2, 1, 3),
  house = c("A", "B", "C", "D")
)

目标格式

2023-01-01    2023-01-02  2023-01-03
1   94.30076     102.78559    93.29053
2          3             1           3         
3   95.58771            NA          NA
4          2            NA          NA

你的尝试问题点

直接用pivot_wider按price和num_floors转宽,会生成price_2023-01-01、num_floors_2023-01-01这类拆分后的列,和目标格式的列结构完全不符,没法实现按日期为列、每行对应同一房屋price/num_floors的布局。

可行解决方法

核心思路是先给每个日期下的房屋标记序号,再把price和num_floors拆成独立行,最后按日期转宽:

library(tidyverse)

df_transformed <- df %>%
  # 按日期分组,给每个日期下的房屋加序号(第1套、第2套...)
  group_by(date) %>%
  mutate(row_id = row_number()) %>%
  ungroup() %>%
  # 把price和num_floors转成长格式,统一存入value列
  pivot_longer(cols = c(price, num_floors), names_to = "var", values_to = "value") %>%
  # 构造最终行号:第n套房屋的price对应行2n-1,num_floors对应行2n
  mutate(final_row = case_when(
    var == "price" ~ row_id * 2 - 1,
    var == "num_floors" ~ row_id * 2
  )) %>%
  # 按final_row分组,转宽成日期为列的格式,缺失值填NA
  pivot_wider(names_from = date, values_from = value, values_fill = NA) %>%
  # 清理无关列并按行号排序
  select(final_row, everything()) %>%
  arrange(final_row) %>%
  column_to_rownames("final_row")

运行后输出结果与目标格式一致:

print(df_transformed)
#>      2023-01-01 2023-01-02 2023-01-03
#> 1       94.3008    102.786     93.291
#> 2        3.0000      1.000      3.000
#> 3       95.5877         NA         NA
#> 4        2.0000         NA         NA

内容的提问来源于stack exchange,提问作者jonas Chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:05:19