问题描述
我在 R 中有一个矩阵,我想从每一行中抽取一个随机样本.我的一些数据在 NA 中,但是在进行随机样本时,我不希望 NA 成为采样的一个选项.我将如何做到这一点?
I have a matrix in R that I would like to take a single random sample from each row. Some of my data is in NA, but when taking the random sample I do not want the NA to be an option for the sampling. How would I accomplish this?
例如
a <- matrix (c(rep(5, 10), rep(10, 10), rep(NA, 5)), ncol=5, nrow=5)
a
[,1] [,2] [,3] [,4] [,5]
[1,] 5 5 10 10 NA
[2,] 5 5 10 10 NA
[3,] 5 5 10 10 NA
[4,] 5 5 10 10 NA
[5,] 5 5 10 10 NA
当我将样本函数应用于这个矩阵以输出另一个矩阵时,我得到
When I apply the sample function to this matrix to output another matrix I get
b <- matrix(apply(a, 1, sample, size=1), ncol=1)
b
[,1]
[1,] NA
[2,] NA
[3,] 10
[4,] 10
[5,] 5
相反,我不希望 NA 能够成为输出并希望输出类似于:
Instead I do not want the NA to be capable of being the output and want the output to be something like:
b
[,1]
[1,] 10
[2,] 10
[3,] 10
[4,] 5
[5,] 10
推荐答案
可能有更好的方法,但示例似乎没有任何与 NA 相关的参数,因此我只是编写了一个匿名函数来处理 NA.
There might be a better way but sample doesn't appear to have any parameters related to NAs so instead I just wrote an anonymous function to deal with the NAs.
apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)})
基本上做你想做的事.如果你真的想要矩阵输出,你可以做
essentially does what you want. If you really want the matrix output you could do
b <- matrix(apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)}), ncol = 1)
您没有要求这样做,但我提出的解决方案在某些情况下确实会失败(主要是如果一行仅包含 NA.
You didn't ask for this but my proposed solution does fail in certain cases (mainly if a row contains ONLY NAs.
a <- matrix (c(rep(5, 10), rep(10, 10), rep(NA, 5)), ncol=5, nrow=5)
# My solution works fine with your example data
apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)})
# What happens if a row contains only NAs
a[1,] <- NA
# Now it doesn't work
apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)})
# We can rewrite the function to deal with that case
mysample <- function(x, ...){
if(all(is.na(x))){
return(NA)
}
return(sample(x[!is.na(x)], ...))
}
# Using the new function things work.
apply(a, 1, mysample, size = 1)
这篇关于忽略示例函数中的值或 NA的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!