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.index
和 sample
。
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
我正在努力解决标题中的问题。
我的数据框是这样的:
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.index
和 sample
。
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