2012-12-05 10 views
7

Próbuję sformatować kolumnę danych w wielu kolumnach binarnych, aby ostatecznie wykorzystać do eksploracji reguł asocjacyjnych. Osiągnąłem pewien sukces za pomocą pętli for i prostej macierzy tripletów, ale nie jestem pewien, jak agregować dane przez poziomy w pierwszej kolumnie - podobnie jak w przypadku grupy według instrukcji w SQL. Podałem przykład poniżej, aczkolwiek z dużo mniejszym zbiorem danych - jeśli się powiedzie, mój aktualny zestaw danych będzie wynosił 4200 wierszy o 3.902 kolumn, więc każde rozwiązanie musi być skalowalne. Wszelkie sugestie i alternatywne podejścia byłyby bardzo mile widziane!Konwertuj dane wiersza na kolumny binarne

> data <- data.frame(a=c('sally','george','andy','sue','sue','sally','george'), b=c('green','yellow','green','yellow','purple','brown','purple')) 
> data 
     a  b 
1 sally green 
2 george yellow 
3 andy green 
4 sue yellow 
5 sue purple 
6 sally brown 
7 george purple 

x <- data[,1] 
for(i in as.numeric(2:ncol(data))) 
x <- cbind(x, simple_triplet_matrix(i=1:nrow(data), j=as.numeric(data[,i]), 
       v = rep(1,nrow(data)), dimnames = list(NULL, levels(data[,i])))) 

##Looks like this: 

> as.matrix(x) 

    name brown green purple yellow 
[1,] "sally" "0" "1" "0"  "0"  
[2,] "george" "0" "0" "0"  "1" 
[3,] "andy" "0" "1" "0"  "0"  
[4,] "sue" "0" "0" "0"  "1" 
[5,] "sue" "0" "0" "1"  "0"  
[6,] "sally" "1" "0" "0"  "0" ##Need to aggregate by Name 

##Would like it to look like this: 
    name brown green purple yellow 
[1,] "sally" "1" "1" "0" "0"  
[2,] "george" "0" "0" "0" "1" 
[3,] "andy" "0" "1" "0" "0"  
[4,] "sue" "0" "0" "1" "1" 
+0

Dlaczego chcesz wszystko jako znak? Czy 'as.data.frame.matrix (dane)' osiąga to, co chcesz? – A5C1D2H2I1M1N2O1R2T1

Odpowiedz

4

To powinno załatwić sprawę:

## Get a contingency table of counts 
X <- with(data, table(a,b)) 

## Massage it into the format you're wanting 
cbind(name = rownames(X), apply(X, 2, as.character)) 
#  name  brown green purple yellow 
# [1,] "andy" "0" "1" "0" "0" 
# [2,] "george" "0" "0" "1" "1" 
# [3,] "sally" "1" "1" "0" "0" 
# [4,] "sue" "0" "0" "1" "1" 
Powiązane problemy