r - 根据一定条件选择逻辑向量元素

标签 r vector subset

我有一种情况,我想根据向量中每个位置的 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

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

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

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

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

执行此操作的最佳矢量化方法是什么?我认为这很简单,但我无法给出答案。提前致谢。

最佳答案

我们可以有效地使用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 个整数值。

Ah, so "a" get assigned to T-T, "b" to T-F, etc. But, why the x + y + x?? I don't follow adding x twice.

如果只执行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)

关于r - 根据一定条件选择逻辑向量元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41626888/

相关文章:

python - 生成包含集合所有元素的子集的所有可能排列

python - 如何从n个列表中形成所有可能的组合

C++ vector 访问错误

r - 检查一行中的值是否在 R 中的组之间重复

r - 如何将 CSV 数据文件加载到 R 中以与 quantmod 一起使用

r - TCGA2STAT R 包在 windows 中不起作用 : How to resolve?

c++ - 根据类内的字符串对用户定义类的 vector 进行排序

c++ - 更改 vector 中的位置值 + 自动创建该位置并在需要时增加 vector 范围

java - 测试 String 属于常量子集的正确方法 (Java)

r - dplyr 中基于 Shiny 输入的条件过滤器