如何用spread()将datetime转换为列名?R语言数据处理求助
一步步搞定你的数据重塑与调度列表需求
我来帮你一步步实现这个需求,从数据类型修正到最终生成可用的调度列表,咱们一步步来:
1. 先把字符型时间转成真正的datetime类型
首先得把key列和第二列(你没说具体列名,我暂时叫它target_datetime,记得替换成你实际的列名)的字符格式转成datetime类型,这一步很重要,避免后续列名或时间处理出错:
library(dplyr) library(tidyr) library(lubridate) # 转换时间格式,根据你的实际时间格式调整函数(比如带时分秒用ymd_hms()) clean_data <- new_dat %>% mutate( key = ymd(key), target_datetime = ymd(target_datetime) )
2. 用spread()把行值转成列名
这里要注意:如果同一个key对应多个target_datetime值,直接spread会报错,所以咱们先把每个key对应的所有时间打包成列表,再做spread:
# 先按key分组,把对应时间存成列表,再spread成列 spread_data <- clean_data %>% group_by(key) %>% summarise(time_list = list(target_datetime)) %>% spread(key, time_list)
这样每个列名就是原来key里的时间值,列里存的是对应组的所有datetime集合。
3. 转成列表用于调度
最后把这个tibble转成列表,就能直接配合你的调度函数使用了:
# 转成列表(因为spread后是单行多列,取第一行即可) schedule_list <- as.list(spread_data[1, ]) # 可选:把列表名称转成datetime类型(如果调度需要的话) names(schedule_list) <- ymd(names(schedule_list))
现在schedule_list里的每个元素都是对应时间key的datetime列表,直接拿去做调度就好啦~
小提示
- 记得把代码里的
target_datetime替换成你数据集第二列的实际列名; - 如果你的时间格式不是
YYYY-MM-DD,调整lubridate的函数,比如mdy()(月-日-年)或者dmy()(日-月-年); - 如果每个
key只对应一个target_datetime值,那可以去掉summarise那一步,直接用spread(key, target_datetime)就行。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

