【问题标题】:subsetting matrix including NA's包括 NA 的子集矩阵
【发布时间】:2016-09-06 20:51:36
【问题描述】:

我有一个这样的矩阵:

     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] 中的错误:二元运算符的非数字参数

任何帮助将不胜感激。

【问题讨论】:

  • 您是否关心观察结果是否有序,或者是否可以是 50% 观察结果的随机样本?
  • 一个随机样本工作得很好,因为我稍后会将它与另一个矩阵相交。
  • 是的,这是 class(mv) 命令告诉我的

标签: r subset na


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    dplyr 中的 sample_frac() 函数听起来很适合您的需求。

    install.packages('dplyr')
    library(dplyr)
    
    subset_matrix <- apply(mv, 2, function(x) sample_frac(x, .5, replace = F))
    

    您可以指定要在sample_frac() 中采样的行的哪一部分。使用apply() column-wise 将为您提供每列的那部分观察值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      相关资源
      最近更新 更多