r - 忽略示例函数中的值或 NA

标签 r matrix sample 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

当我将样本函数应用于这个矩阵以输出另一个矩阵时,我得到
b <- matrix(apply(a, 1, sample, size=1), ncol=1)
b

     [,1]
[1,]   NA
[2,]   NA
[3,]   10
[4,]   10
[5,]    5

相反,我不希望 NA 能够成为输出,并且希望输出类似于:
b
     [,1]
[1,]   10
[2,]   10
[3,]   10
[4,]    5
[5,]   10

最佳答案

可能有更好的方法,但样本似乎没有任何与 NA 相关的参数,所以我只是编写了一个匿名函数来处理 NA。

apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)})

基本上做你想做的。如果你真的想要矩阵输出,你可以做
b <- matrix(apply(a, 1, function(x){sample(x[!is.na(x)], size = 1)}), ncol = 1)

编辑:您没有要求这样做,但我提出的解决方案在某些情况下确实会失败(主要是如果一行仅包含 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)

关于r - 忽略示例函数中的值或 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9970116/

相关文章:

rollapply 与一个函数采用矩阵返回 "incorrect number of dimensions"

python - Pytorch如何将除第一维之外的可变大小的张量相乘

matrix - 在 C 中优化矩阵计算

java - 在文本文件中转置矩阵的有效方法是什么?

apache-spark - Spark的takeSample()结果分两个阶段

r - 将2020年5月31日的日期格式转换为R中的时间序列数据

r - 在 cairo_pdf 中设置粗体样式

R - 自动创建每日文件以记录来自 RStudio 控制台的所有内容

java - 测试 cxf 示例项目 java_first_spring_support 是否有效

r - 存储sample()函数后剩余的数字