子集矩阵包括NA

时间:2016-05-11 12:34:49

标签: r subset na

我有一个像这样的矩阵:

     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))
}

然而,当我这样做时,我收到警告:

  

quantile.default(mv,0.5)出错:       如果'na.rm'为FALSE

,则不允许缺少值和NaN

当我尝试这段代码时:

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

我得到了

  

(1 - h)中的错误* qs [i]:二元运算符的非数字参数

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

不使用任何包而只使用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"

答案 1 :(得分:1)

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

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

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

您可以在sample_frac()中指定要采样的行数。逐列apply()将为每列提供一小部分观察结果。

我没有对此进行测试,因为您没有提供数据样本,但它看起来应该有效。