Kev*_*vin 5 r sample matrix apply
我在R中有一个矩阵,我想从每一行中取一个随机样本.我的一些数据是在NA中,但在采用随机样本时,我不希望NA作为采样的选项.我怎么做到这一点?
例如,
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
Run Code Online (Sandbox Code Playgroud)
当我将样本函数应用于此矩阵以输出另一个矩阵时,我得到了
b <- matrix(apply(a, 1, sample, size=1), ncol=1)
b
[,1]
[1,] NA
[2,] NA
[3,] 10
[4,] 10
[5,] 5
Run Code Online (Sandbox Code Playgroud)
相反,我不希望NA能够作为输出,并希望输出类似于:
b
[,1]
[1,] 10
[2,] 10
[3,] 10
[4,] 5
[5,] 10
Run Code Online (Sandbox Code Playgroud)
可能有更好的方法,但样本似乎没有任何与NA相关的参数,所以我只是写了一个匿名函数来处理NA.
apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)})
Run Code Online (Sandbox Code Playgroud)
基本上做你想要的.如果你真的想要矩阵输出,你可以做到
b <- matrix(apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)}), ncol = 1)
Run Code Online (Sandbox Code Playgroud)
编辑:您没有要求这个,但我提议的解决方案在某些情况下确实失败(主要是如果一行只包含NA.
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5229 次 |
| 最近记录: |