基于事件时间值矩阵生成偏移值转换矩阵的技术问询
R语言矩阵按规则转换实现
原始矩阵
首先定义输入的原始矩阵:
original_mat <- structure(c(0, 0, NA, NA, NA, NA, 0, 0, NA, NA, NA, 1, NA, NA, NA, NA, 0, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, 1, 0, NA, NA, NA, NA, NA, 0, NA, NA, NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, NA, NA, 0, 1, 1, 0, NA, NA, 0, 1, 1, NA, 1, 0, 0, 0, NA, NA, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, NA, NA, 0, 1, 1, 0, NA, NA, 1, 1, NA, NA, 1, 0, 1, 1, NA, NA, 0, 1, 1, 1, 0, 1, 0, NA, NA, NA, NA, NA, NA, NA, 0, 1, 1, 0, NA, NA, 1, 1, NA, NA, 1, 0, NA, NA, NA, NA, 0, 1, NA, NA, 0, 1, 0, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, 0, NA, NA, 1, 1, NA, NA, 1, 0, NA, NA, NA, NA, 0, 1, NA, NA, 1, 1, 0, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, 0, NA, NA, 1, 1, NA, NA, 1, 0, NA, 1, NA, NA, 1, 1, NA, NA, NA, NA, 0, NA, NA, NA, NA, NA), dim = c(30L, 7L), dimnames = list(c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30"), c("1", "2", "4", "5", "6", "7", "8")))
转换规则
- 原矩阵行中的
0转换为-1; - 原行中
0右侧的1,转换后的值为该1的位置索引与最近左侧0的位置索引之差减1; - 原行中无
0但有1时,以第一个1的位置为起始点,后续1转换为当前位置索引与第一个1位置索引之差; - 原行中的
NA保持不变。
实现代码
通过自定义单行转换函数,结合apply逐行处理矩阵:
# 定义单行转换函数 convert_row <- function(x) { res <- x # 处理0的转换 res[x == 0] <- -1 # 定位所有1的位置 one_pos <- which(x == 1) if (length(one_pos) == 0) return(res) # 定位所有0的位置 zero_pos <- which(x == 0) for (p in one_pos) { # 找到当前1左侧最近的0 left_zeros <- zero_pos[zero_pos < p] if (length(left_zeros) > 0) { res[p] <- p - max(left_zeros) - 1 } else { # 无0时以第一个1为基准 first_one <- min(one_pos) res[p] <- p - first_one } } return(res) } # 应用转换并保留行列名 converted_mat <- t(apply(original_mat, 1, convert_row)) dimnames(converted_mat) <- dimnames(original_mat)
验证结果
查看转换后的前5行:
head(converted_mat)
输出:
1 2 4 5 6 7 8 1 -1 0 1 2 3 4 5 2 -1 0 1 2 3 4 5 3 NA NA NA NA NA NA NA 4 NA NA NA NA NA NA NA 5 NA NA NA NA NA NA NA 6 NA NA NA NA NA NA NA
内容的提问来源于stack exchange,提问作者user3483060
相关产品推荐
相关产品推荐

