【问题标题】:Finding index of vector from two other vectors从其他两个向量中查找向量的索引
【发布时间】:2020-08-30 03:15:35
【问题描述】:

我正在尝试使用其他两个向量来索引一个向量。我可以毫无问题地从第一个向量索引,但我从第二个值的条件索引一直导致问题。

我的示例代码如下

h=rep(seq(1:24),90)
m=rep(1:3,each=24*30)
d=rep(1:30,each=24*3)

我的目标是使用 match(或其他更适合的函数)来确定哪些小时值对应于 m=1 或 m=2 和 d=2 或 3 的所有实例

我的尝试如下

hin=match(m,1)|(match(m,2)&match(d,2:3))

在这种情况下,元素 1:720 和 745:793 应为 True,但只有 1:720 为 TRUE。如何执行上述参数的第二部分,以便识别后面的值?

编辑

创建一个重现性更高的示例:

h2=rep(seq(1:5),4)
d2=rep(rep(1:2,each=5),2)
m2=rep(1:2,each=10)

目标是创建一个包含 10 TRUE、5 FALSE、5 TRUE 的逻辑向量 (m=1 或 (m=2 and d=2)) 最终使用这个逻辑向量将创建一个新的 h2 删除元素 11:15

目标输出:

hin2=c(rep("TRUE",10),rep("FALSE",5),rep("TRUE",5))
h2new=c(rep(seq(1:5),2),rep(NA,5),seq(1:5))

hin2
 [1] "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "FALSE"
[12] "FALSE" "FALSE" "FALSE" "FALSE" "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE" 

h2new
 [1]  1  2  3  4  5  1  2  3  4  5 NA NA NA NA NA  1  2  3  4  5

【问题讨论】:

    标签: r match


    【解决方案1】:

    使用字面逻辑运算符给出布尔值hin2。然后只需 replaceNA 的否定。

    hin2 <- m2 %in% 1 | (m2 %in% 2 & d2 %in% 2)
    # [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
    # [13] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
    h2new <- replace(h2, !hin2, NA)
    # [1]  1  2  3  4  5  1  2  3  4  5 NA NA NA NA NA  1  2  3  4  5
    

    要选择值,请执行以下操作:

    h_new <- h2[!is.na(h2new)]
    # [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
    

    【讨论】:

      【解决方案2】:

      您可以用NA 替换满足条件的h2 值:

      h2[!((m2 == 1) | (m2 == 2 & d2 == 2))] <- NA
      h2
      #[1]  1  2  3  4  5  1  2  3  4  5 NA NA NA NA NA  1  2  3  4  5
      

      【讨论】:

      • 不完全。我的目标是确定 m=1 或 m=2 和 d=2 或 3 的所有点的索引位置。理想情况下,我将能够使用结果向量从不同数据中的等效索引中对数据进行子集化.frame
      • 为了进一步澄清,我想象我将有一个与上述 m 和 d 向量长度相同的向量,但只包含与 m=1 或 (m=2 和d=2 或 3),其余为 NaN 值。
      • @johnnyg 你能创建一个小例子并显示它的预期输出吗?目前,mhd 的长度为 2160,因此很难准确测试您想要的内容。
      • 我想我的答案已经给出了index location of all points in which m=1 or m=2 and d=2 or 3.。这就是这段代码返回的which(m %in% 1:2 &amp; d %in% 2:3)
      • @Gwang-Jin Kim d2 中没有 d2 == 3 值。我也认为 OP 在编辑中改变了他们的条件。现在条件是(m=1 or (m=2 and d=2))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2022-10-18
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      相关资源
      最近更新 更多