我有一种情况,我想根据向量中每个位置的 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]
为TRUE
,y[i]
为TRUE
;x[i]
为FALSE
,y[i]
为TRUE
,x[i]
为TRUE
,y[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
因此您可以看到 TRUE
和 FALSE
的 4 个组合映射到 4 个整数值。
Ah, so "a" get assigned to
T-T
, "b" toT-F
, etc. But, why thex + y + x
?? I don't follow addingx
twice.
如果只执行x + y
,结果只有 0、1 和 2。您将无法区分 T-F
和 F-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/