[英]R add all combinations of three values of a vector to a three-dimensional array
我有一個包含兩列的數據框。 第一個“V1”表示找到第二列“V2”的不同項目的對象,例如:
V1 <- c("A", "A", "A", "A", "B", "B", "B", "C", "C", "C", "C")
V2 <- c("a","b","c","d","a","c","d","a","b","d","e")
df <- data.frame(V1, V2)
例如,“A”包含“a”、“b”、“c”和“d”。 我正在尋找的是一個三維數組,其維度為length(unique(V2))
(名稱“a”到“e”為dimnames
)。
對於V1
的每個唯一值,我想要三個V2
項目的所有可能組合(例如,對於“A”,它將是c("a", "b", "c")
, c("a", "b", "d"
和c("b", "c", "d")
。
這些“三項共現”中的每一個都應被視為三維數組中的一個坐標,因此應將其添加到數組中的值應顯示的頻率計數中。 結果應該是以下數組
ar <- array(data = c(0,0,0,0,0,0,0,1,2,1,0,1,0,2,0,0,2,2,0,1,0,1,0,1,0,
0,0,1,2,1,0,0,0,0,0,1,0,0,1,0,2,0,1,0,1,1,0,0,1,0,
0,1,0,2,0,1,0,0,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,
0,2,2,0,1,2,0,1,0,1,2,1,0,0,0,0,0,0,0,0,1,1,0,0,0,
0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0),
dim = c(5, 5, 5),
dimnames = list(c("a", "b", "c", "d", "e"),
c("a", "b", "c", "d", "e"),
c("a", "b", "c", "d", "e")))
我想知道您的結果的 3D 對稱性。 我花了一段時間才明白你想要擁有所有組合的所有排列。
library(gtools) #for the permutations
foo <- function(x) {
#all combinations:
combs <- combn(x, 3, simplify = FALSE)
#all permutations for each of the combinations:
combs <- do.call(rbind, lapply(combs, permutations, n = 3, r = 3))
#tabulate:
do.call(table, lapply(asplit(combs, 2), factor, levels = letters[1:5]))
}
#apply grouped by V1, then sum the results
res <- Reduce("+", tapply(df$V2, df$V1, foo))
#check
all((res - ar)^2 == 0)
#[1] TRUE
我曾經使用交叉連接CJ()
來保留兩個不同 V2 項目的所有組合的成對計數
res <- setDT(df)[,CJ(unique(V2), unique(V2)), V1][V1!=V2,
.N, .(V1,V2)][order(V1,V2)]
此代碼創建一個包含三列的數據框res
。 V1
和V2
包含來自原始數據幀df
的V2
的相應項, N
包含計數( V1
和V2
出現多少次具有相同的V1
值(來自原始數據幀df
)。
現在,我發現我也可以通過添加另一個unique(V2)
並相應地調整代碼的 rest 來執行具有三個“維度”的交叉連接。
結果是一個有四列的數據框。 V1, V2, and V3
表示原始V2
項目, N
再次表示與相同原始V1
對象相互出現的次數。
res <- setDT(df)[,CJ(unique(V2), unique(V2), unique(V2)), V1][V1!=V2 & V1 != V3 & V2 != V3,
.N, .(V1,V2,V3)][order(V1,V2,V3)]
此代碼的優點是不考慮所有空組合(根本不出現的組合)。 它使用V1
中的 1,000,000 個唯一值和V2
中的 600 多個唯一項,否則會導致 600 x 600 x 600 的極大數組
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.