2016-12-30 42 views
1

有沒有簡單的方法可以確定一個向量是嵌套在另一箇中的?換句話說,在下面的示例中,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

你需要'任何(複製(RLE(酒吧)$值))所有(在%RLE(巴FOO%)$值)' – akrun

+0

@! akrun第一部分('!any(duplicated(rle(bar)$ values)')是比我想要的更強的約束。如果'foo'是'c(1,1,1,1,2,2,2,2)'而'bar'是'c(1,2,1,2,3,4,3,4)''那麼'bar'仍然會嵌套在'foo' – drammock

回答

4

假設你有兩個因素fg,並想知道是否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) 

如果所有列只有一個非零項,你有嵌套在fg 。換句話說:

all(colSums(M > 0L) == 1L) 
## `TRUE` if you have nesting 

點評:對於任何方法,你可以很容易地擠碼成一條線。

+0

有趣的方法中,我可以看出它爲什麼會起作用,儘管對於這個特定的問題似乎有點矯枉過正。 – drammock

+0

你編輯的答案有很大的改進,並且更好地解釋了它的工作原理。我仍然認爲基於線性代數的解決方案是過度的(即產生一個隨機的「y」和求解一個線性模型的中間步驟),並且如果你的數據是數字的,並且你忘記了在生成模型矩陣之前調用'factor'。但是,您添加的應急表方法非常簡潔並且可以與數字向量一起使用。 – drammock

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 
相關問題