R:在dataframe/matrix中的某些列中采样n个元素并替换它们的值

R: Sample n elements in certain columns in a dataframe/matrix and replace their values

我正在努力解决标题中的问题。

我的数据框是这样的:

  X1 X2 X3 X4 X5

1 1  2  3  4  5

2 6  7  8  9 10

3 11 12 13 14 15 

我想做的是从第三列和第四列中随机选择 3 个元素,并将它们的值替换为 0。因此,被操纵的数据框可能像

 X1 X2 X3 X4 X5

1 1  2  3  4  5

2 6  7  0  0 10

3 11 12 13 0 15 

我从这里看到Random number selection from a data-frame如果我将数据框转换成矩阵会更容易,所以我尝试了

mat <- data.frame(rbind(rep(1:5, 1), rep(6:10, 1), rep(11:15, 1)))
mat_matrix <- as.matrix(mat)
mat_matrix[sample(mat_matrix[, 3:4], 3)] <- 0 

但它只是在矩阵的所有列和行中随机选择 3 个元素并将它们变成 0。

谁能帮帮我?

在这种情况下,for 循环没有问题。大概是这样的:


mat <- data.frame(rbind(rep(1:5, 1), rep(6:10, 1), rep(11:15, 1)))
cols <- c(3,4)

n <- nrow(mat)*length(cols)
v <- sample( x=1:n, size=3 )
m <- matrix(FALSE, ncol=length(cols), nrow=nrow(mat))
m[v] <- TRUE

for( i in seq_along(cols) ) {
    mat[ m[,i], cols[i] ] <- 0
}

只需创建一个两列的“索引矩阵”,您可以对其进行采样并用于替换回您的数据。

您可以从中使用 slice.indexsample

mat_matrix[sample(slice.index(mat_matrix, 1:2)[,3:4], 3)] <- 0

这是使用 replace

的一种方法
cols <- c("X3", "X4")
N <- 3
df[cols] <- replace(as.matrix(df[cols]), sample(length(unlist(df[cols])), N), 0)

这样

> df
  X1 X2 X3 X4 X5
1  1  2  3  0  5
2  6  7  8  0 10
3 11 12  0 14 15