如何通过NA值随机替换数据框中不是NA的15%的值? 我需要知道哪些值已被替换。这些职位必须存储在另一个布尔矩阵中。
我的困难是只替换那些尚未成为NA的值。
编辑: 这是一个示例:
NA 1 2 3 4
4 3 6 8 2
3 8 3 NA 7
我想替换那些不是NA的15%的值(13%的15%,即1值)。
答案 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))