随机选择R中不是NA的值

时间:2011-11-30 09:38:41

标签: r

如何通过NA值随机替换数据框中不是NA的15%的值? 我需要知道哪些值已被替换。这些职位必须存储在另一个布尔矩阵中。

我的困难是只替换那些尚未成为NA的值。

编辑: 这是一个示例:

NA 1 2 3 4
4 3 6 8 2
3 8 3 NA 7

我想替换那些不是NA的15%的值(13%的15%,即1值)。

2 个答案:

答案 0 :(得分:2)

我会将data.frame转换为矩阵(可以将值作为向量访问),找到15%的值并为它们赋值NA。我会让你把替换位置存储起来作为练习。 :)

del <- data.frame(w = runif(25), x = runif(25), y = runif(25), z = runif(25))
del <- as.matrix(del)
get.sample.index <- sample.int(n = length(del), size = 0.15 * length(del))
extract.del.vals <- del[get.sample.index] # these are the values that will be NA
del[get.sample.index] <- NA # assign those values NA
del <- as.data.frame(del)

由于我们已经有一个带有NA的data.frame,所以我们只采样非NA的值。您必须决定要抽样的15%,包括NA或排除。

# addendum
del <- as.matrix(del)
which.are.na <- which(is.na(del) == TRUE)
sample.index <- 1:length(del)
sample.index <- sample.index[-which.are.na] #exclude those that are NA
get.sample.index2 <- sample(x = sample.index, size = 0.15 * length(sample.index))
del[get.sample.index2] <- NA
del <- as.data.frame(del)

答案 1 :(得分:1)

由于提供的样本数据有点太小而无法看到发生了什么,这里有一个更好的设置:

n_data <- 200
some_data <- matrix(runif(200), nrow = 20)
some_data[sample(n_data, 100)] <- NA
some_data

Roman的方法很好,所以这只是代码的一个更清晰的迭代。

number_of_nas <- sum(is.na(some_data))
fifteen_pct_of_nas <- 0.15 * number_of_nas
na_positions <- which(is.na(some_data))
indicies_to_replace <- sample(na_positions, fifteen_pct_of_nas)
some_data[indicies_to_replace] <- 999

如果您更喜欢矩阵形式的替换值的标记,请使用arrayInd

arrayInd(indicies_to_replace, dim(some_data))