2015-10-31 7 views
6

mam ramki danych, która wygląda następująco:Tworzenie tabeli awaryjnych za pomocą wielu kolumn w ramce danych, w R

structure(list(ab = c(0, 1, 1, 1, 1, 0, 0, 0, 1, 1), bc = c(1, 
1, 1, 1, 0, 0, 0, 1, 0, 1), de = c(0, 0, 1, 1, 1, 0, 1, 1, 0, 
1), cl = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 2)), .Names = c("ab", "bc", 
"de", "cl"), row.names = c(NA, -10L), class = "data.frame") 

Cl kolumna wskazuje związek klastra i zmienne ab bc & de przeprowadzić binarny odpowiedzi, gdzie 1 wskazuje tak i 0 - nr

Próbuję utworzyć klaster krzyżowy tabulacji wraz z wszystkimi innymi kolumnami w ramce danych viz ab, bc i de, gdzie klastry stają się zmiennymi kolumn. Sygnał wyjściowy jest jak ten

1 2 3 
ab 1 3 2 
bc 2 3 1 
de 2 3 1 

Próbowałem następujący kod:

with(newdf, tapply(newdf[,c(3)], cl, sum)) 

To daje mi Wartości krzyż tabbing tylko jedną kolumnę w danym momencie. Moja ramka danych ma 1600 kolumn z 1 kolumną klastra. Czy ktoś może pomóc?

+1

Wydaje można spróbować z 'Agregat podstawowy; 'aggregate (. ~ cl, newdf, sum)'? –

+0

alexis_laz ... dziękuję za prostą egzekucję. To naprawdę miłe, ale ponieważ mój aktualny zestaw danych zawiera 1600 zmiennych, trudno jest przeczytać je wszystkie za jednym razem. – Apricot

Odpowiedz

6

Twoje dane są w połowie długości połowy szerokości formatu, a chcesz go w pełni szerokim formacie. Jest to najprostszy jeśli najpierw przekształca go w pełni długim formacie:

library(reshape2) 
df_long = melt(df, id.vars = "cl") 
head(df_long) 
# cl variable value 
# 1 1  ab  0 
# 2 2  ab  1 
# 3 3  ab  1 
# 4 1  ab  1 
# 5 2  ab  1 
# 6 3  ab  0 

Wtedy możemy przekształcić go w szerokim formacie, korzystając sum jako funkcja agregacji:

dcast(df_long, variable ~ cl, fun.aggregate = sum) 
# variable 1 2 3 
# 1  ab 1 3 2 
# 2  bc 2 3 1 
# 3  de 2 3 1 
7

Jednym ze sposobów, za pomocą dplyr byłoby:

library(dplyr) 
df %>% 
    #group by the varialbe cl 
    group_by(cl) %>% 
    #sum every column 
    summarize_each(funs(sum)) %>% 
    #select the three needed columns 
    select(ab, bc, de) %>% 
    #transpose the df 
    t 

wyjściowa:

[,1] [,2] [,3] 
ab 1 3 2 
bc 2 3 1 
de 2 3 1 
4

W base R:

t(sapply(data[,1:3],function(x) tapply(x,data[,4],sum))) 
# 1 2 3 
#ab 1 3 2 
#bc 2 3 1 
#de 2 3 1 
2

można również połączyć tidyr:gather lub reshape2::melt i xtabs mieć swój stolik contengency

library(tidyr) 
xtabs(value ~ key + cl, data = gather(df, key, value, -cl)) 
##  cl 
## key 1 2 3 
## ab 1 3 2 
## bc 2 3 1 
## de 2 3 1 

Jeśli Twój wolą używać Rura

df %>% 
    gather(key, value, -cl) %>% 
    xtabs(value ~ key + cl, data = .) 
Powiązane problemy