将任意随机变点位置及其后的数都赋值为NA

2020-12-29 15:29:38 浏览数 (1)

来源: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

0 人点赞