2011-08-12 11 views
5

Mam następujące dane:podzbiór data.frame dla ggplot2 wykresie słupkowym

Splice.Pair proportion 
1   AA-AG 0.010909091 
2   AA-GC 0.003636364 
3   AA-TG 0.003636364 
4   AA-TT 0.007272727 
5   AC-AC 0.003636364 
6   AC-AG 0.003636364 
7   AC-GA 0.003636364 
8   AC-GG 0.003636364 
9   AC-TC 0.003636364 
10  AC-TG 0.003636364 
11  AC-TT 0.003636364 
12  AG-AA 0.010909091 
13  AG-AC 0.007272727 
14  AG-AG 0.003636364 
15  AG-AT 0.003636364 
16  AG-CC 0.003636364 
17  AG-CT 0.007272727 
...  ... ... 

Chcę uzyskać BarChart wizualizacji proporcję każdej pary spawów ale tylko dla par spawów, które mają udział w ciągu, powiedzmy, 0,004. Próbowałem następujące:

nc.subset <- subset(nc.dat, proportion > 0.004) 
qplot(Splice.Pair, proportion, data=nc.dat.subset,geom="bar", xlab="Splice Pair", ylab="Proportion of total non-canonical splice sites") + coord_flip(); 

Ale to właśnie daje mi wykres słupkowy ze wszystkimi parami spawów na osi Y, z wyjątkiem, że pary światłowodowe, które zostały odfiltrowane są brakujące słupki. enter image description here

nie mam pojęcia, co się dzieje, aby wszystkie kategorie nadal być obecne: s

Odpowiedz

6

Co się dzieje jest to, że Splice.Pair jest czynnikiem. Po podziale ramek danych czynnik zachowuje atrybut poziomów, który nadal ma wszystkie oryginalne poziomy. Można uniknąć tego rodzaju problemu, po prostu owijając swoje podrzędnego w droplevels:

nc.subset <- droplevels(subset(nc.dat, proportion > 0.004)) 

Ogólniej, jeśli lubisz tego rodzaju automatycznego zatrzymywania poziomach z czynników, można ustawić R do przechowywania ciągów jako wektory znaków zamiast czynniki domyślnie po ustawieniu:

options(stringsAsFactors = FALSE) 

na początku sesji R (może to być również przekazywane jako opcja do data.frame również).

EDIT

Jeśli chodzi o kwestię prowadzenia starsze wersje R, które mogą brakuje droplevels, @rcs zwraca uwagę w komentarzu, że metoda jednego czynnika jest bardzo proste do wykonania we własnym zakresie. Sposób ramek danych jest tylko nieco bardziej skomplikowana:

function (x, except = NULL, ...) 
{ 
    ix <- vapply(x, is.factor, NA) 
    if (!is.null(except)) 
     ix[except] <- FALSE 
    x[ix] <- lapply(x[ix], factor) 
    x 
} 

Oczywiście, najlepszym rozwiązaniem jest nadal upgrade do najnowszej wersji R.

+0

Dzięki za wyjaśnienie. Jednak wydaje mi się, że nie mam funkcji droplevels ... – MattLBeck

+0

@kikumbob - Została dodana w (teraz nie tak niedawnej) aktualizacji R, 2.12.0 Wierzę. Chciałbym sprawdzić, w której wersji masz aktualizację. Jeśli nie możesz, istnieje podobna funkcja o nazwie 'drop.levels' w pakiecie' gdata'. – joran

+1

+1 Dla poprawnej odpowiedzi. Ale osobiście uważam, że nierozsądnie jest zmienić "opcje", ponieważ oznacza to, że twój kod staje się mniej podatny na przekazywanie innym. – Andrie

1

Sprawdzić czy Splice.Pair jest czynnikiem. W takim przypadku należy użyć wartości droplevels(), aby usunąć poziomy, które nie są już używane do rozwiązania problemu.

nc.subset <- subset(nc.dat, proportion > 0.004) 
nc.subset$Splice.Pair <- droplevels(nc.subset$Splice.Pair) 
qplot(Splice.Pair, proportion, data=nc.dat.subset,geom="bar", xlab="Splice Pair", ylab="Proportion of total non-canonical splice sites") + coord_flip(); 

Możesz być w stanie włączyć droplevels w qlot, ale to, aby znaleźć you :-)

Powiązane problemy