【问题标题】:R subset 2d array by row, containing specific valueR按行子集二维数组,包含特定值
【发布时间】:2020-05-24 11:06:04
【问题描述】:

我正在尝试使用“any”函数对维度可能不同的二维数组进行子集化,并在任何地方仅提取包含 3 的列。当 3 出现在多个列中时效果很好,但当只有 1(或 0)列包含 3 时会失败。这是我的 mwe:

critval <- 3
arr1 <- as.array (matrix (c (NA, NA, 8, NA, 2, 3, 3,
                             NA, 3, 8, NA, 2, 3, 3,
                             3, NA, 8, NA, 9, 5, 4,
                             8, 7, NA, 9, 5, 4, 2,
                             8, 5, 2, 9, 7, 5, 3), ncol = 5))
arr2 <- as.array (matrix (c (3, NA, 8, NA, 9, 5, 4,
                             8, 7, NA, 9, 5, 4, 2), ncol = 2))
new1 <- arr1 [ , apply(arr1, 2, function(x){any(x == critval, na.rm = TRUE)})]
(jamin1 <- apply(new1, 2, function (x) min(which(x == critval))))

[1] 6 2 1 7

这非常有效,正是我想要的,每列中第一个 3 实例的行索引,对于那些确实存在 3 的列。第一行代码删除任何不包含 3 的列。

new2 <- arr2 [ , apply(arr2, 2, function(x){any(x == critval, na.rm = TRUE)})]
(jamin2 <- apply(new2, 2, function (x) min(which(x == critval))))
Error in apply(new2, 2, function(x) min(which(x == critval))) : 
  dim(X) must have a positive length

但是,当我在较小的数组上尝试时,第一步中的 apply 函数无法正常工作,现在第二阶段抛出错误。我确信它可以做得更优雅,也许在一行中,只是试图看看它在做什么。我是否可以编写一个适用于所有情况的通用函数,即使没有一列包含 3?谢谢。 J

【问题讨论】:

    标签: r arrays subset


    【解决方案1】:

    您可以在矩阵子集设置中使用drop = FALSE 以确保数据在单列时不会丢失其维度。

    除此之外,我们可以使用colSums 来选择至少一个值为critval 的列。

    new1 <- arr1[, colSums(arr1 == critval, na.rm = TRUE) > 0, drop = FALSE]
    apply(new1 == critval, 2, which.max)
    #[1] 6 2 1 7
    
    
    new2 <- arr2[, colSums(arr2 == critval, na.rm = TRUE) > 0, drop = FALSE]
    apply(new2 == critval, 2, which.max)
    #[1] 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2010-12-08
      • 2018-11-13
      • 2011-11-12
      相关资源
      最近更新 更多