2013-05-29 55 views
2

我是R新手,想對列組合做些工作。我正在努力編寫一些代碼來計算列的幾種組合中1的數量。假設我有以下的列:r中的二進制值的組合

A B C d

我想第一計數每一列的1的數目(A,B,C,d)。 然後每2列組合(AB,AC,AD,BC,BD,CD)中的1的數量。 接着的1的每3列的組合(ABC,ACD,BCD)數 接着的1的中的所有列(ABCD)

實際的數據幀具有約10或所以列的數目。

建議爲每個組合創建一個二進制值,然後在數組中包含所有這些二進制值,但任何建議將不勝感激。 非常感謝

+0

結合二進制列A和B是什麼意思?計算OR還是AND? – flodel

+0

或者,計算出現在列A或列B中的所有1。 – DrPaulVella

+0

嗯,我不確定你知道我所指的是OR ...所以只是爲了澄清,如果A是(0,0,1,1)而B是(0,1,1,0),那麼A和B結合的結果應該是3還是4? – flodel

回答

2

某些樣本數據:

n <- 10 
dat <- data.frame(A = sample(0:1, n, replace = TRUE), 
        B = sample(0:1, n, replace = TRUE), 
        C = sample(0:1, n, replace = TRUE), 
        D = sample(0:1, n, replace = TRUE)) 

給定一個號碼來組合列的函數,計算所有的組合和相應的總和:

count.or <- function(dat, n = 2) { 
    or.sum <- function(cols) sum(rowSums(dat[cols]) > 0) 
    counts <- combn(colnames(dat), n, FUN = or.sum) 
    names <- combn(colnames(dat), n, FUN = paste, collapse = "") 
    setNames(counts, names) 
} 

在動作:

count.or(dat, 1) 
# A B C D 
# 6 6 5 9 
count.or(dat, 2) 
# AB AC AD BC BD CD 
# 8 7 9 9 10 9 
count.or(dat, 3) 
# ABC ABD ACD BCD 
# 9 10 9 10 
count.or(dat, 4) 
# ABCD 
# 10 

或在一個電話:

unlist(lapply(1:4, count.or, dat = dat)) 
# A B C D AB AC AD BC BD CD ABC ABD ACD BCD ABCD 
# 6 6 5 9 8 7 9 9 10 9 9 10 9 10 10 
+0

非常感謝! – DrPaulVella