2012-11-14 16 views
13

Powiel możliwe:
How to sort a dataframe by column(s) in RJak mogę zamówić ramkę danych przez drugą kolumnę w R?

Zastanawiam się, czy ktoś może mi pomóc, mam co myślę powinny być łatwe do rozwiązania problemem.

mam poniższej tabeli:

SampleID   Cluster 

R0132F041p   1 

R0132F127   1 

R0132F064   1 

R0132F068p   1 

R0132F015   2 

R0132F094   3 

R0132F105   1 

R0132F013   2 

R0132F114   1 

R0132F014   2 

R0132F039p   3 

R0132F137   1 

R0132F059   1 

R0132F138p   2 

R0132F038p   2 

i chciałbym do sortowania/zamów go Klastra, aby uzyskać wyniki jak poniżej:

SampleID Cluster 

R0132F041p 1 

R0132F127 1 

R0132F064 1 

R0132F068p 1 

R0132F105 1 

R0132F114 1 

R0132F137 1 

R0132F059 1 

R0132F015 2 

R0132F013 2 

R0132F014 2 

R0132F138p 2 

R0132F038p 2 

R0132F094 3 

R0132F039p 3 

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

data<-read.table('Table.txt', header=TRUE,row.names=1,sep='\t') 

data <- data.frame(data) 
data <- data[order(data$Cluster),] 
write.table(data, file = 'OrderedTable.txt', append = TRUE,quote=FALSE, sep = '\t', na ='NA', dec = '.', row.names = TRUE, col.names = FALSE) 

i otrzymamy następujące dane wyjściowe:

1 1 

2 1 

3 1 

4 1 

5 1 

6 1 

7 1 

8 1 

9 2 

10 2 

11 2 

12 2 

13 2 

14 3 

15 3 

Dlaczego te SampleIDs zastąpiono numerami 1-15 i co te liczby oznaczają, czytałem stronę ?order() jednak wydaje się to wyjaśnić sort.list lepiej niż kolejności() jeśli ktokolwiek mógłby mi w tym pomóc, byłbym bardzo wdzięczny.

Odpowiedz

10

Krótka odpowiedź brzmi, że zrobiłeś to doskonale. Po prostu masz trudności z czytaniem i pisaniem plików. Przeżywa kodzie:

data<-read.table('Table.txt', header=TRUE,row.names=1,sep='\t') 

Powyższa linia czyta w twoich danych w porządku, ale row.names=1 powiedziano go używać jako pierwszą kolumnę nazw rzędów. Teraz twoje SampleIDs są nazwami wierszy zamiast być ich własną kolumną. Jeśli wpiszesz data lub head(data) lub str(data) natychmiast po uruchomieniu tego wiersza, powinno to być jasne. Po prostu pomiń ten argument row.names i będzie on poprawnie czytany.

data <- data.frame(data) 

Nie trzeba tę powyższą linię ponieważ read.table() produkuje dataframe. Możesz to zobaczyć także z str(data).

data <- data[order(data$Cluster),] 

Powyższa linia jest idealna.

write.table(data, file = 'OrderedTable.txt', append = TRUE, 
    quote=FALSE, sep = '\t', na ='NA', dec = '.', row.names = TRUE, 
    col.names = FALSE) 

Tutaj zawarte argument col.names = FALSE dlatego plik nie ma nazwy kolumn. Ty również nie potrzebujesz/chcesz append=TRUE. Jeśli spojrzysz na help(write.table), zobaczysz, że jest "istotne tylko, jeśli plik jest ciągiem znaków". Tutaj wydaje się, że plik zapisuje się bez kończenia ostatniej linii, co prawdopodobnie spowoduje, że późniejszy read.table() narzekać.

Numery 1-15 w twoim wyniku wyglądają jak numery wierszy. Nie wyjaśniasz, jak patrzysz na wynikowy plik, więc nie mogę być tego pewien. Prawdopodobnie czytasz plik w sposób, który nie analizuje nazw wierszy i zamiast tego wyświetla numery wierszy. Jeśli upewnisz się, że Twoja kolumna SampleID nie zostanie przypisana do nazw rzędów, prawdopodobnie wszystko będzie dobrze.

+0

Dziękuję bardzo, że działa teraz idealnie i zostało to wyjaśnione bardzo dobrze, jesteś gwiazdą. – sinead

5

Zapoznaj się z funkcją arrange pakietu plyr.

arrange(data, Cluster) 
write.table(data, "ordered_data.txt") 
+1

Dzięki młynowi za sugestię, przyjrzę się temu pakietowi plyr i tej funkcji. może być użyteczny – sinead

+0

Szybciej, prościej, lepiej. – linello

Powiązane problemy