2016-12-14 9 views
0

Ich habe einen großen geordneten Datenrahmen in R, der zwei Spalten enthält, "Gen" und "Rang", und ich möchte das zweite Vorkommen der doppelten Zeile in der positiven Richtung UND entfernen das erste Auftreten der doppelten Zeile in negativer Richtung.R: Bedingte doppelte Zeilen entfernen

beispielsweise in dem folgenden Datensatz würde Ich mag Linien entfernen 6262 und 12200, so dass ich die Gene mit dem höchsten Rangwert in jede Richtung halten:

> head(a_ordered, n=10) 
       gene  rank 
10597  SLC37A1 2.827330 
6262  SLC37A1 2.700882 
12504   UBR4 2.698938 
10934  SP110 2.690130 
1563   CALB1 2.633179 
6031 LOC100128239 -2.499959 
6718  MBTPS1 -2.513134 
1528   CA14 -2.549553 
12200  NXPE3 -2.850011 
7978   NXPE3 -3.153175 

Wird,

> head(a_ordered, n=10) 
        gene  rank 
    10597  SLC37A1 2.827330 
    12504   UBR4 2.698938 
    10934  SP110 2.690130 
    1563   CALB1 2.633179 
    6031 LOC100128239 -2.499959 
    6718  MBTPS1 -2.513134 
    1528   CA14 -2.549553 
    7978   NXPE3 -3.153175 

Vielen Dank!

+0

@RichScriven, entspricht der Rangwert einer assoziierten faltenartigen Veränderung der Genexpression für das jeweilige interessierende Gen, und ich möchte das Gen behalten, das den stärksten Downregulationswert zeigt. – emblake

Antwort

0

Sie können dplyr::filter verwenden, um diese Zeilen zu halten, für die abs(rank) == max(abs(rank)) von gene gruppiert:

library(dplyr) 
res <- df %>% group_by(gene) %>% filter(abs(rank) == max(abs(rank))) 
##Source: local data frame [8 x 3] 
##Groups: gene [8] 
## 
##  ID   gene  rank 
## <int>  <chr>  <dbl> 
##1 10597  SLC37A1 2.827330 
##2 12504   UBR4 2.698938 
##3 10934  SP110 2.690130 
##4 1563  CALB1 2.633179 
##5 6031 LOC100128239 -2.499959 
##6 6718  MBTPS1 -2.513134 
##7 1528   CA14 -2.549553 
##8 7978  NXPE3 -3.153175 

Daten:

df <- structure(list(ID = c(10597L, 6262L, 12504L, 10934L, 1563L, 6031L, 
6718L, 1528L, 12200L, 7978L), gene = c("SLC37A1", "SLC37A1", 
"UBR4", "SP110", "CALB1", "LOC100128239", "MBTPS1", "CA14", "NXPE3", 
"NXPE3"), rank = c(2.82733, 2.700882, 2.698938, 2.69013, 2.633179, 
-2.499959, -2.513134, -2.549553, -2.850011, -3.153175)), .Names = c("ID", 
"gene", "rank"), class = "data.frame", row.names = c(NA, -10L 
)) 
##  ID   gene  rank 
##1 10597  SLC37A1 2.827330 
##2 6262  SLC37A1 2.700882 
##3 12504   UBR4 2.698938 
##4 10934  SP110 2.690130 
##5 1563  CALB1 2.633179 
##6 6031 LOC100128239 -2.499959 
##7 6718  MBTPS1 -2.513134 
##8 1528   CA14 -2.549553 
##9 12200  NXPE3 -2.850011 
##10 7978  NXPE3 -3.153175 
+0

Brilliant! Vielen Dank! – emblake

0

Wenn Sie die Werte behalten möchten, die von Null am meisten verschieden sind , können Sie den quadratischen Wert verwenden und dann den Datenrahmen entsprechend bestellen

a_ordered$rank2 <- a_ordered$rank^2 
a_ordered <- a_ordered[order(a_ordered$rank2, decreasing = TRUE),] 
a_ordered <- a_ordered[-(duplicated(a_ordered$gene)==TRUE),] 

Dupliziert wird die Spalte von oben nach unten durchlaufen und den zweiten (und dritten usw.) Wert als doppelt markieren.