来源:R语言交流群-花儿少年
问题:在矩阵中,随机找到每一行的任意位置作为变点位置,然后把每一行变点位置及其后面的数都赋值为NA
思路:在矩阵中选择一个数据,可以通过值,也可以通过位置(索引)。因此,我将此问题转换为一个位置查找(随机数)的问题。
处理:在矩阵中取位置(行和列),根据位置取数,然后根据位置将目标数据替换为NA
代码语言:javascript复制# 生产一个100*5的矩阵
mx <-matrix(1:600,nrow = 100, ncol= 6)
set.seed(1234)
#随机生成100个1~6的数列
# 对应每行(100行)行中随机选择一个变点位置(共100个变点)
randx <- ceiling(runif(100, min = 0, max = 1)*6)
#创建一个空数列,用于存储单值列
mx1 <- matrix(NA,nrow=nrow(mx),ncol = 1)
for (i in 1:nrow(mx)) {
# 对mx每一行和改行的随机列(数)做引用,并赋值给mx1的第i行
mx1[i] <- mx[i,randx[i]]
}
mx2 <- mx #创建一个mx2矩阵,并根据mx1每个值在原mx的每行出现的位置定位赋值na
for (i in 1:nrow(mx)) {
mx2[i,randx[i]:ncol(mx)] <- NA
}
head(mx) #原始矩阵
head(randx) #找到每一行的任意位置作为变点位置
head(mx1) #存储从mx找到的每一行的任意位置作为变点值
head(mx2) #把每一行变点位置及其后面的数都赋值为NA
效果如下:
代码语言:javascript复制> head(mx) #原始矩阵
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 101 201 301 401 501
[2,] 2 102 202 302 402 502
[3,] 3 103 203 303 403 503
[4,] 4 104 204 304 404 504
[5,] 5 105 205 305 405 505
[6,] 6 106 206 306 406 506
> head(randx) #找到每一行的任意位置作为变点位置
[1] 1 4 4 4 6 4
> head(mx1) #存储从mx找到的每一行的任意位置作为变点值
[,1]
[1,] 1
[2,] 302
[3,] 303
[4,] 304
[5,] 505
[6,] 306
> head(mx2) #把每一行变点位置及其后面的数都赋值为NA
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] NA NA NA NA NA NA
[2,] 2 102 202 NA NA NA
[3,] 3 103 203 NA NA NA
[4,] 4 104 204 NA NA NA
[5,] 5 105 205 305 405 NA
[6,] 6 106 206 NA NA NA