2017-10-26 5 views
0

Ich habe eine data.frame mit 2 Spalten, wo Werte in der zweiten Spalte wiederholt werden. zum Beispiel: in Spalte Zellereshape ein data.frame basierend auf ähnlichen Wert in einer Spalte

 HUGO      Cell 
1 CD28     T cells 
2 CD3D     T cells 
3 CD3G     T cells 
4 CD8A    lymphocytes 
5 EOMES    lymphocytes 
6 FGFBP2    lymphocytes 
7 GNLY    lymphocytes 
8 NCR1     NK cells 
9 PTGDR    NK cells 
10 SH2D1B    NK cells 

Ich möchte alle Werte in Spalte HUGO einen eindeutigen Namen in eine Namensliste nach jedem eindeutigen Namen erhalten entsprechen.

zum Beispiel

T cells: CD28  CC3D  C34 
lymphocytes: CD8A EOMES FGFBP2 FGFBP2 GNLY 
... 

Ich habe versucht,
reshape(data.frame, timevar = "HUGO",idvar = "Cell",direction = "wide") aber es gibt gerade Anzahl von Werten für jeden Namen in Zellenspalte.

+1

'split (df $ HUGO, df $ Handy)'. – Psidom

Antwort

3

Hier sind einige Möglichkeiten, je nachdem, was Sie wollen. Die ersten 5 verwenden keine Pakete.

1) aggregate/c Dies gibt einen Datenrahmen, dessen zweite Spalte ein Zeichenvektor von HUGO-Namen ist.

aggregate(HUGO ~ Cell, DF, c) 

geben:

  Cell      HUGO 
1 lymphocytes CD8A, EOMES, FGFBP2, GNLY 
2 NK cells  NCR1, PTGDR, SH2D1B 
3  T cells   CD28, CD3D, CD3G 

2) Aggregat/toString Diese Spalte ein Datenrahmen, dessen zweiter ergibt enthält Zeichenfolgen, die HUGO Namen mit Komma trennt.

aggregate(HUGO ~ Cell, DF, toString) 

geben:

  Cell      HUGO 
1 lymphocytes CD8A, EOMES, FGFBP2, GNLY 
2 NK cells  NCR1, PTGDR, SH2D1B 
3  T cells   CD28, CD3D, CD3G 

3) entstapeln Dies ergibt eine Liste, eine Komponente pro Zelle, deren Komponenten jeweils die HUGO Namen dieser Zelle.

unstack(DF) 

geben:

$lymphocytes 
[1] "CD8A" "EOMES" "FGFBP2" "GNLY" 

$`NK cells` 
[1] "NCR1" "PTGDR" "SH2D1B" 

$`T cells` 
[1] "CD28" "CD3D" "CD3G" 

4) tapply Dies ergibt eine Matrix, deren Zeilen sind Zellen und deren Spalten die Ordnungszahl des Namens HUGO.

DF2 <- transform(DF, seq = ave(seq_along(HUGO), Cell, FUN t= seq_along)) 
tapply(DF2$HUGO, DF2[-1], c) 

geben:

   seq 
Cell   1  2  3  4  
    lymphocytes "CD8A" "EOMES" "FGFBP2" "GNLY" 
    NK cells "NCR1" "PTGDR" "SH2D1B" NA  
    T cells  "CD28" "CD3D" "CD3G" NA 

5) umformen Dies verwendet DF2 aus der letzten Alternative zusammen mit reshape einem Datenrahmen zu geben:

reshape(DF2, timevar = "seq", idvar = "Cell", dir = "wide") 

geben:

  Cell HUGO.1 HUGO.2 HUGO.3 HUGO.4 
1  T cells CD28 CD3D CD3G <NA> 
4 lymphocytes CD8A EOMES FGFBP2 GNLY 
8 NK cells NCR1 PTGDR SH2D1B <NA> 

6) verteilen Dies ergibt ein "tbl_df" Klassenobjekt als Ausgabe (die eine Unterklasse von "data.frame" ist)

library(dplyr) 
library(tidyr) 

DF %>% 
    group_by(Cell) %>% 
    mutate(seq = 1:n()) %>% 
    ungroup() %>% 
    spread(seq, HUGO) 

geben:

  Cell 1  2  3 4 
1 lymphocytes CD8A EOMES FGFBP2 GNLY 
2 NK cells NCR1 PTGDR SH2D1B <NA> 
3  T cells CD28 CD3D CD3G <NA> 

7) read.zooread.zoo a ergibt Zoo-Objekt, dessen Zeiten die Zellen sind.
Da die Zeiten eigentlich Zeichenfolgen sind, verwenden wir FUN=identity, um eine Interpretation zu vermeiden. fortify.zoo wandelt das in einen Datenrahmen um. DF2 ist von oben.

library(zoo) 

fortify.zoo(read.zoo(DF2, split = "seq", index = "Cell", FUN = identity)) 

geben:

 Index 1  2  3 4 
1 lymphocytes CD8A EOMES FGFBP2 GNLY 
2 NK cells NCR1 PTGDR SH2D1B <NA> 
3  T cells CD28 CD3D CD3G <NA> 

8) dcast Dies als Ausgabe ein data.table gibt.

library(data.table) 

DT <- data.table(DF) 
DT[, seq:=1:.N, by = Cell] 
dcast(DT, Cell ~ seq, value.var = "HUGO") 

geben:

  Cell 1  2  3 4 
1: NK cells NCR1 PTGDR SH2D1B NA 
2:  T cells CD28 CD3D CD3G NA 
3: lymphocytes CD8A EOMES FGFBP2 GNLY 

Hinweis:

DF <- structure(list(HUGO = c("CD28", "CD3D", "CD3G", "CD8A", "EOMES", 
"FGFBP2", "GNLY", "NCR1", "PTGDR", "SH2D1B"), Cell = c("T cells", 
"T cells", "T cells", "lymphocytes", "lymphocytes", "lymphocytes", 
"lymphocytes", "NK cells", "NK cells", "NK cells")), .Names = c("HUGO", 
"Cell"), class = "data.frame", row.names = c(NA, -10L)) 
Verwandte Themen