是否有一种简单的方法可以确定一个向量是否嵌套在另一个向量中?换句话说,在下面的示例中,bar
的每个值都与foo
中的一个且仅一个值相关联,因此bar
嵌套在foo
中。
data.frame(foo=rep(seq(4), each=4), bar=rep(seq(8), each=2))
澄清一下,这是理想的结果:
foo <- rep(seq(4), each=4)
bar <- rep(seq(8), each=2)
qux <- rep(seq(8), times=2)
# using a fake operator for illustration:
bar %is_nested_in% foo # should return TRUE
qux %is_nested_in% foo # should return FALSE
答案 0 :(得分:7)
假设您有两个因素f
和g
,并且想知道g
是否嵌套在f
中。
方法1:对于喜欢线性代数的人
考虑两个因素的设计矩阵:
Xf <- model.matrix(~ f + 0)
Xg <- model.matrix(~ g + 0)
如果g
嵌套在f
中,则Xf
的列空间必须是Xg
列空间的子空间。换句话说,对于Xf
列的任何线性组合:y = Xf %*% bf
,等式Xg %*% bg = y
可以解决完全。
y <- Xf %*% rnorm(ncol(Xf)) ## some random linear combination on `Xf`'s columns
c(crossprod(round(.lm.fit(Xg, y)$residuals, 8))) ## least squares residuals
## if this is 0, you have nesting.
方法2:对于喜欢统计数据的人
我们检查列联表:
M <- table(f, g)
如果所有列只有一个非零条目,则g
嵌套在f
中。换句话说:
all(colSums(M > 0L) == 1L)
## `TRUE` if you have nesting
评论:对于任何方法,您都可以轻松地将代码压缩到一行。
答案 1 :(得分:1)
我认为这会奏效:
nested_in <- function(b, a) {
df <- data.frame(a, b)
all(sapply(split(df, df$b), function(i) length(unique(i$a)) < 2))
}
foo <- rep(seq(4), each=4)
bar <- rep(seq(8), each=2)
qux <- rep(seq(8), times=2)
nested_in(bar, foo) # TRUE
nested_in(qux, foo) # FALSE