簡體   English   中英

R 將向量的三個值的所有組合添加到三維數組

[英]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 V1V2包含來自原始數據幀dfV2的相應項, N包含計數( V1V2出現多少次具有相同的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM