在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
相关产品推荐
相关产品推荐

