2017-02-21 9 views
3

Мои данные выглядит следующим образом, все столбцы с двоичным наличие/отсутствие данных:Cross Вкладки - должны объединить несколько столбцов на основе определенных значений в других столбцах

POP1 POP2 POP3 T1 T2 T3 T4 T5 T6 T7 T8 T9 
1  1  0  1  1  1  1  0  1  0  0  1 
1  0  1  0  1  1  0  1  1  0  1  1 
1  1  0  1  1  1  1  0  0  1  0  1 
0  0  0  0  1  1  0  1  0  1  1  0 
1  0  1  0  0  1  1  1  0  1  1  0 
0  1  0  0  1  1  1  0  0  0  0  1 
0  1  0  1  1  0  1  0  0  0  0  0 
1  1  1  0  1  0  0  0  1  0  0  0 
0  0  0  0  1  1  1  1  1  0  0  1 
1  0  0  1  0  1  0  1  0  1  1  1 
1  1  0  0  1  0  1  0  0  1  0  0 
1  0  1  0  1  1  1  0  1  0  1  0 
0  1  0  1  1  1  1  0  0  0  0  0 
1  0  0  0  1  1  0  0  0  0  1  1 

The POP1: POP3 являются население, и мне нужно подсчеты всех 1 для всех T1: T9 для всех POP1 = 1, POP2 = 1 и POP3 = 1. Мне нужна таблица, crosstabulates моих данных, как это:

  T1 T2 T3 T4 T5 T6 T7 T8 T9 
POP1=1 3  9  7  5  3  4  4  5  5 
POP2=1 4  7  8  6  2  3  2  0  3 
POP3=1 0  3  4  2  2  2  1  3  1 

Не беспокоить проверки агрегированных отсчетов, они не обязательно правильно. Я пробовал много синтаксисов, не получая того, что хочу. Благодарен за некоторые рекомендации.

ответ

4

Вам понадобится матричное умножение %*% здесь:

t(df[1:3]) %*% as.matrix(df[4:12]) 

    T1 T2 T3 T4 T5 T6 T7 T8 T9 
POP1 3 7 7 5 3 4 4 5 5 
POP2 4 7 4 6 0 2 2 0 3 
POP3 0 3 3 2 2 3 1 3 1 
+0

При использовании synthax на моих реальных данных, где есть много больше столбцов я получаю эту ошибку: Ошибка в т (sysrev60 [85: 103])% *% as.matrix (sysrev60 [40:68]): требует числовых/сложных матричных/векторных аргументов. Слишком много столбцов? – Dag

+0

Возможно, некоторые из ваших столбцов не являются числовыми, вы можете проверить классы столбцов на 'lapply (sysrev60, class)'. – Psidom

+0

Только что проверили. Они все числовые. – Dag

2
df = structure(list(POP1 = c(1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 
1L, 1L, 0L, 1L), POP2 = c(1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 
0L, 1L, 0L, 1L, 0L), POP3 = c(0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 
0L, 0L, 0L, 1L, 0L, 0L), T1 = c(1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 
0L, 1L, 0L, 0L, 1L, 0L), T2 = c(1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 
1L, 0L, 1L, 1L, 1L, 1L), T3 = c(1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 
1L, 1L, 0L, 1L, 1L, 1L), T4 = c(1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 
1L, 0L, 1L, 1L, 1L, 0L), T5 = c(0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 
1L, 1L, 0L, 0L, 0L, 0L), T6 = c(1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 
1L, 0L, 0L, 1L, 0L, 0L), T7 = c(0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 
0L, 1L, 1L, 0L, 0L, 0L), T8 = c(0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 
0L, 1L, 0L, 1L, 0L, 1L), T9 = c(1L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 
1L, 1L, 0L, 0L, 0L, 1L)), .Names = c("POP1", "POP2", "POP3", 
"T1", "T2", "T3", "T4", "T5", "T6", "T7", "T8", "T9"), class = "data.frame", 
row.names = c(NA, -14L)) 

library(reshape2) 
df = melt(df, id.vars = colnames(df)[-(1:3)]) 

do.call(rbind, lapply(split(df, df$variable), function(x) 
        apply(x[x$value == 1,1:9], 2, function(y) sum(y)))) 

#  T1 T2 T3 T4 T5 T6 T7 T8 T9 
#POP1 3 7 7 5 3 4 4 5 5 
#POP2 4 7 4 6 0 2 2 0 3 
#POP3 0 3 3 2 2 3 1 3 1 
+0

Я пробовал это и получил сообщение об ошибке: Ошибка в split.default (x = seq_len (nrow (x)), f = f, drop = drop, ...): длина группы равна 0, но длина данных> 0 – Dag