【问题标题】:Selecting logical vector elements based on certain conditions根据特定条件选择逻辑向量元素
【发布时间】:2017-01-13 03:19:18
【问题描述】:

我有一种情况,我想根据向量中每个位置的 TRUE / FALSE 组合检测两个逻辑命名向量之间的条件。例如:

x <- c(TRUE, FALSE, FALSE, TRUE)
names(x) <- c("a", "b", "c", "d")
y <- c(TRUE, TRUE, FALSE, FALSE)
names(y) <- names(x)

对于这两个向量中的每个元素,我想检测 3 个条件:

  • x[i]TRUEy[i]TRUE;
  • x[i]FALSEy[i]TRUE
  • x[i]TRUEy[i]FALSE

xy 的长度相同,但可能比此示例更长。我想检索每个条件的元素名称并将元素名称分配给一个新变量。对于这个例子:

v1 <- "a"
v2 <- "b"
v3 <- "d"

在这两个向量的较长版本中,我可能会得到类似的结果:

v1 <- c("a", "e")
v2 <- c("b", "f", "g")
v3 <- c("d", "i", "k", "l")

什么是最好的矢量化方式来做到这一点。我认为这很简单,但我无法想出答案。提前致谢。

【问题讨论】:

    标签: r vector subset


    【解决方案1】:

    我们可以高效地使用split,但在此之前,我们需要一个单独的分组索引。这是一种可能性:

    g <- x + y + x
    split(names(x), g)
    

    要理解上述分组索引,请考虑以下几点:

    x <- c(TRUE, TRUE, FALSE, FALSE)
    y <- c(TRUE, FALSE, TRUE, FALSE)
    x + y + x
    #[1] 3 2 1 0
    

    所以你可以看到TRUEFALSE的4个组合映射到4个整数值。

    啊,所以“a”被分配给T-T,“b”被分配给T-F,等等。但是,为什么x + y + x?我不关注两次添加x

    如果你只做x + y,结果只有0、1和2。你将无法区分T-FF-T,因为它们都是1。


    @thelatemail 提供了一种更易读的方式:

    split(names(x), interaction(x, y, drop=TRUE))
    

    更新

    啊...愚蠢的我...我为什么要费心创建g。我突然想起我们可以在split 中给f 参数传递一个列表:

    split(names(x), list(x, y))
    

    注意,内部在split.default

    if (is.list(f)) 
        f <- interaction(f, drop = drop, sep = sep)
    

    【讨论】:

    • 啊,所以“a”被分配给 T-T,“b”被分配给 T-F,等等。但是,为什么 x + y + x?我不遵循添加 x 两次。好的我明白了。这为 4 种情况生成 4 个不同的整数,使用逻辑作为整数。聪明!!
    • 另一个帮助交互的示例 - split(names(x), interaction(x,y,drop=TRUE)) - 可能比通过添加创建 g 更易于解释
    • 非常好!非常感谢你们!
    • x+y+x 逻辑印象深刻。好的 ! +1 @ZheyuanLi
    • 不幸的是,我选择了一个非常糟糕的例子。例如,在我有 x
    猜你喜欢
    • 1970-01-01
    • 2016-01-22
    • 2021-02-24
    • 1970-01-01
    • 2020-09-30
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    相关资源
    最近更新 更多