如何将R语言的data.table转换为按MV分组的矩阵列表?
解决方案
嘿,这个需求用data.table的分组特性就能轻松搞定,下面是具体的步骤和代码:
1. 先确保数据包含完整时间段(可选但推荐)
如果你的原始data.table里,部分MV可能缺失某些时间段(比如没有1-178的全部记录),那第一步要先补全所有MV对应的178个时间段,避免生成矩阵时长度不够:
# 假设你的data.table名为dt library(data.table) # 生成所有MV和1-178时间段的笛卡尔积,左连接原表补全数据 full_dt <- dt[CJ(MV = unique(MV), time = 1:178), on = .(MV, time)] # 按需填充缺失值(比如consumption缺省填0,isAbsentBool缺省填TRUE,可根据实际需求调整) full_dt[, `:=`( consumption = fifelse(is.na(consumption), 0, consumption), dailySd = fifelse(is.na(dailySd), 0, dailySd), isAbsentBool = fifelse(is.na(isAbsentBool), TRUE, isAbsentBool) )]
2. 按MV分组生成矩阵列表
接下来就可以按MV分组,为每个MV生成包含三个矩阵的子列表:
# 分组生成矩阵,每个MV对应一个包含三个矩阵的列表 matrix_result <- full_dt[, .( matrix_set = list( consumption = matrix(consumption, nrow = 178, dimnames = list(paste0("time_", time), NULL)), dailySd = matrix(dailySd, nrow = 178, dimnames = list(paste0("time_", time), NULL)), isAbsentBool = matrix(isAbsentBool, nrow = 178, dimnames = list(paste0("time_", time), NULL)) ) ), by = MV] # 把结果转换成以MV值为名称的列表,方便后续调用 matrix_result <- setNames(matrix_result$matrix_set, matrix_result$MV)
3. 调用示例
现在你可以直接通过MV名称访问对应的矩阵了:
# 获取MV=1的consumption矩阵 matrix_result[["1"]]$consumption # 获取MV=2的isAbsentBool矩阵 matrix_result[["2"]]$isAbsentBool
注意点
- 如果你的原始数据中每个MV已经有完整的178条时间段记录,那第一步补全数据的操作可以跳过,直接执行第二步即可。
matrix()函数里的nrow=178是指定矩阵为178行1列,如果你需要其他维度(比如1行178列),可以改成ncol=178。
内容的提问来源于stack exchange,提问作者Cos
相关产品推荐
相关产品推荐

