2013-05-29 2 views
2

Я новичок в R и хотел бы сделать некоторую работу над комбинациями столбцов. Я изо всех сил пытаюсь написать код, который будет считать число 1 в нескольких комбинациях столбцов. Предположим, у меня есть следующие столбцы:Комбинации двоичных значений в r

A B C D

Я хотел бы сначала подсчитать количество 1-х годов в каждой отдельной колонке (А, В, С, D). Затем количество 1 в каждой комбинации из двух столбцов (AB, AC, AD, BC, BD, CD). Тогда число 1-х годов в каждой комбинации 3-колонки (ABC, ACD, BCD) Тогда число 1 во всех колонках (ABCD)

Фактический кадр данных имеет около 10 или около столбцов.

Было предложено создать двоичное значение для каждой комбинации, а затем иметь все эти двоичные значения в массиве, но любые советы будут оценены. Большое спасибо

+0

Что означает объединение двоичных столбцов A и B? Вычислить OR или AND? – flodel

+0

OR, вычислить все 1, которые отображаются в столбцах A или B. – 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

Смежные вопросы