包含 NA 的子集矩阵

subsetting matrix including NA's

我有一个像这样的矩阵:

     a    b    c    d
[1]  as   ac   ad   ae
[2]  bd   bf   bg   bh
[3]  NA   cf   cd   ce
[4]  NA   NA   dr   dy
[5]  NA   NA   NA   ej 

我想根据 50% 的观察结果将每一列分别子集化为一个矩阵或列表,因此我希望我的输出如下所示:

     a    b    c    d
[1]  as   ac   ad   ae
[2]  NA   bf   bg   bh
[3]  NA   NA   NA   ce

到目前为止,我习惯于为没有 NA 的单独列编码。

mv.s <- subset(mv, mv <= quantile(mv, 0.5))    

现在我正在考虑使用类似

的东西
for (i in 1:15) {
mv.s[[i]] <- subset(mv[[i]], mv <= quantile(mv, 0.5))
}

但是,当我这样做时,我收到警告:

Error in quantile.default(mv, 0.5) : missing values and NaN's not allowed if 'na.rm' is FALSE

当我尝试此代码时:

for (i in 1:15) {
mv.s[[i]] <- subset(mv[[i]], mv <= quantile(mv[[i]], 0.5))
}

我明白了

Error in (1 - h) * qs[i] : non-numeric argument to binary operator

如有任何帮助,我们将不胜感激。

dplyr 中的 sample_frac() 功能听起来很符合您的需要。

install.packages('dplyr')
library(dplyr)

subset_matrix <- apply(mv, 2, function(x) sample_frac(x, .5, replace = F))

您可以指定要在 sample_frac() 中抽样的行部分。按列使用 apply() 将为您提供每一列的观察分数。

我没有测试这个,因为你没有提供你的数据样本,但它看起来应该有效。

不使用任何包,只使用应用函数,您可以执行以下操作。

apply(mat, 2, FUN = function(x){ sample(x, ceiling(length(x)/2), replace = FALSE)})

这会在不替换的情况下对每列的观察结果进行随机抽样,并假设您的矩阵称为 mat

如果您使用 set.seed(1) 使随机样本可重现,结果将如下所示。

     [,1] [,2] [,3] [,4]
[1,] "bd" NA   NA   "ae"
[2,] NA   "ac" "cd" "ej"
[3,] NA   "cf" "bg" "dy"