随机替换矩阵中的元素

时间:2014-10-20 11:28:31

标签: r random-sample

我想随机替换matrix中具有指定值的元素,此处为-99。我尝试了下面的第一种方法,它没有用。然后我尝试了另一种方法,也在下面,它确实有效。

为什么第一种方法不起作用?我做错了什么?谢谢你的任何建议。

我怀疑第二种方法更好,因为除了工作之外,它还允许我指定我想要替换的元素的百分比。第一种方法不会,因为它可以重复随机绘制相同的i,j对。

这是第一种方法,一种不起作用的方法:

# This does not work

set.seed(1234)

ncols    <-  10
nrows    <-   5
NA_value <- -99

my.fake.data <- round(rnorm(ncols*nrows, 20, 5))

my.fake.grid <- matrix(my.fake.data, nrow=nrows, ncol=ncols, byrow=TRUE)
my.fake.grid

random.i <- sample(ncols, round(0.40*nrows*ncols), replace = TRUE)
random.j <- sample(nrows, round(0.40*nrows*ncols), replace = TRUE)

my.fake.grid[random.j, random.i] <- NA_value
my.fake.grid

这是第二种方法,即可行的方法:

# This works

set.seed(1234)

ncols    <-  10
nrows    <-   5
NA_value <- -99

my.fake.data <- round(rnorm(ncols*nrows, 20, 5))

my.fake.grid <- matrix(my.fake.data, nrow=nrows, ncol=ncols, byrow=TRUE)
my.fake.grid

my.fake.data2 <- c(my.fake.grid)

random.x <- sample(length(my.fake.data2), round(0.40*length(my.fake.data2)), replace = FALSE)

my.fake.data2[random.x] <- NA_value

my.fake.grid2 <- matrix(my.fake.data2, nrow=nrows, ncol=ncols, byrow=FALSE)
my.fake.grid2

1 个答案:

答案 0 :(得分:3)

可以尝试

library(data.table) # For faster cross/join, alterantively could use expand.grid
temp <- as.matrix(CJ(seq_len(nrows), seq_len(ncols))) # Create all possible row/column index combinations
indx <- temp[sample(nrow(temp), round(0.4 * nrow(temp))), ] # Sample 40% of them
my.fake.grid[indx] <- NA_value # Replace with -99
sum(my.fake.grid == -99)/(ncols * nrows) # Validating percentage
##[1] 0.4