【问题标题】:R - filtering Matrix based off True/False vectorR - 基于真/假向量的过滤矩阵
【发布时间】:2015-04-29 18:47:53
【问题描述】:

我有一个可以同时包含向量和矩阵的数据结构。我想根据真假列过滤它。我不知道如何成功过滤它们。

result <- structure(list(aba = c(1, 2, 3, 4), beta = c("a", "b", "c", "d"), 
chi = structure(c(0.438148361863568, 0.889733991585672, 0.0910745360888541, 
0.0512442977633327, 0.812013201415539, 0.717306115897372, 0.995319503592327, 
0.758843480376527, 0.366544214077294, 0.706843026448041, 0.108310810523108, 
0.225777650484815, 0.831163870869204, 0.274351604515687, 0.323493955424055, 
0.351171918679029), .Dim = c(4L, 4L))), .Names = c("aba", "beta", "chi"))

> result
$aba
[1] 1 2 3 4

$beta
[1] "a" "b" "c" "d"

$chi
           [,1]      [,2]      [,3]      [,4]
[1,] 0.43814836 0.8120132 0.3665442 0.8311639
[2,] 0.88973399 0.7173061 0.7068430 0.2743516
[3,] 0.09107454 0.9953195 0.1083108 0.3234940
[4,] 0.05124430 0.7588435 0.2257777 0.3511719

tf <- c(T,F,T,T)

我想做的是像

> lapply(result,function(x) {ifelse(tf,x,NA)})
$aba
[1]  1 NA  3  4

$beta
[1] "a" NA  "c" "d"

$chi
[1] 0.43814836         NA 0.09107454 0.05124430

但是 $chi 矩阵结构丢失了。

我期望的结果是

ifelse(matrix(tf,ncol=4,nrow=4),result$chi,NA)
           [,1]      [,2]      [,3]      [,4]
[1,] 0.43814836 0.8120132 0.3665442 0.8311639
[2,]         NA        NA        NA        NA
[3,] 0.09107454 0.9953195 0.1083108 0.3234940
[4,] 0.05124430 0.7588435 0.2257777 0.3511719

我遇到的问题是如何将 tf 向量与数据相匹配。感觉就像我需要使用基于数据类型的条件来设置它,我想避免这种情况。感谢您的想法和答案。

【问题讨论】:

  • 我只想编写一个自定义函数来将 TRUE/FALSE 向量应用于您的数据结构。然后,您可以根据需要应用您的功能。对于矩阵,它将是 mat[!tf, ] &lt;- NA
  • 是的。我希望我不必按类型歧视。转换为 data.frame 也不起作用,因为它将向量视为单行。我可能必须将其作为具有数据类型检查的自定义函数来完成。
  • 如果不是基于类型,你希望怎么做?
  • 你也可以检查dim而不是类型。
  • 不是每次的数据结构都一样吗?

标签: r matrix vector


【解决方案1】:

我不明白如何避免检查数据类型或数据的“维度”。因此,我会提出类似的建议:

lapply(result, function(x) { 
  if (is.null(dim(x))) x[!tf] <- NA else x[!tf, ] <- NA
  x 
})
# $aba
# [1]  1 NA  3  4
# 
# $beta
# [1] "a" NA  "c" "d"
# 
# $chi
#            [,1]      [,2]      [,3]      [,4]
# [1,] 0.43814836 0.8120132 0.3665442 0.8311639
# [2,]         NA        NA        NA        NA
# [3,] 0.09107454 0.9953195 0.1083108 0.3234940
# [4,] 0.05124430 0.7588435 0.2257777 0.3511719

【讨论】:

    【解决方案2】:

    这看起来很简单:

     is.na(tf) <- !tf   # convert FALSE to NA
     result$chi[ tf, ]  # and use the default behavior of "[" with NA arg
    
               [,1]      [,2]      [,3]      [,4]
    [1,] 0.43814836 0.8120132 0.3665442 0.8311639
    [2,]         NA        NA        NA        NA
    [3,] 0.09107454 0.9953195 0.1083108 0.3234940
    [4,] 0.05124430 0.7588435 0.2257777 0.3511719
    

    但现在我看到您希望 NA 在原子向量的相应位置。不幸的是,带有附加 NULL 参数的“[”会在该类型的对象上出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-19
      • 2021-12-12
      • 1970-01-01
      • 2022-12-03
      • 2015-04-23
      • 2020-09-09
      • 2018-08-29
      • 1970-01-01
      相关资源
      最近更新 更多