2016-10-05 4 views
0

Ich muss einige Operationen in einem Datenrahmen durchführen und da es ein bisschen speziell ist, habe ich keine Ahnung, wie ich sie ausführen soll. Hier einige Daten:Auswählen aufeinanderfolgender Zeilen in einem Datenrahmen ... r

x<-seq(1:250) 
pos<-seq(1000,1249,1) 
pval<-c(rep(0.25,40),rep(0.0001,10),rep(0.14,100),rep(0.0005,20),rep(0.58,10),rep(0.00001,20),rep(0.85,50)) 
len<-rep(0.1,250) 
nsnp<-rep(33.7,250) 
data<-data.frame(cbind(x,pos,pval,len,nsnp)) 

Nun, so mein Problem ist, dass ich einen Datenrahmen von diesem zu schaffen, aber ich brauche die aufeinander folgenden Zeilen kombinieren nach Daten $ pval. Das heißt, nach Daten sortieren $ x Ich muss alle aufeinanderfolgenden Elemente, die eine Daten $ pval < = als 0,05 haben. Und durch:

  1. Mittlere Daten $ pos zwischen dem ersten und letzten Mal in Folge Elemente mit Daten $ pval < = 0,05
  2. Summe all aufeinander folgende Daten $ len mit Daten $ pval < = 0,05
  3. Sum alle aufeinanderfolgenden Daten $ nsnp mit Daten $ pval < = als 0,05

Da in unserem Datenrahmen (Daten) gibt es drei Regionen mit aufeinanderfolgenden Daten $ x Zahlen, sieht die endgültige Datenbank sollte wie folgt aus:

 pos len nsnp 
[1,] 1044.5 1 337 
[2,] 1159.5 2 674 
[3,] 1189.5 2 674 

Diese Zahlen kann wie folgt erreicht werden:

data2<-subset(data,data$pval<=0.05) 
mean(data2$pos[data2$pos>=1040 & data2$pos<=1049]) 
sum(data2$len[data2$pos>=1040 & data2$pos<=1049]) 
sum(data2$nsnp[data2$pos>=1040 & data2$pos<=1049]) 
mean(data2$pos[data2$pos>=1150 & data2$pos<=1169]) 
sum(data2$len[data2$pos>=1150 & data2$pos<=1169]) 
sum(data2$nsnp[data2$pos>=1150 & data2$pos<=1169]) 
mean(data2$pos[data2$pos>=1180 & data2$pos<=1199]) 
sum(data2$len[data2$pos>=1180 & data2$pos<=1199]) 
sum(data2$nsnp[data2$pos>=1180 & data2$pos<=1199]) 

Ich hoffe nun, mein Problem verstanden wird. Mein Problem ist, dass ich nicht finden konnte, wie man die aufeinanderfolgenden Reihen entsprechend Daten $ x auswählt. Diese aufeinanderfolgenden Zeilen in meinem Beispiel sind: Pos. 1040-1049, Pos. 1150-1169 und Pos. 1180-1199.

+0

Hallo Cebs. Was hast du versucht? – Vincent

+0

Für den ersten Teil ich Teilmenge nach Daten $ pval. Ich weiß jedoch nicht, wie ich anfangen soll, die Operationen der aufeinanderfolgenden Zeilen zu erhalten. Danke – Cebs

+0

Wieder verstehe ich nicht, warum meine Frage ist downvote ... Ist eine perfekte legit Frage, mit einem Beispiel und ich glaube gut erklärt, bitte jemand erklären mir, warum ... – Cebs

Antwort

2

Es scheint, dass dies durch die Gruppierung von pval getan werden kann, so dplyr verwenden,

library(dplyr) 
data2 %>% 
    group_by(pval) %>% 
    summarise(pos = mean(pos), len = sum(len), nsnp = sum(nsnp)) 
# A tibble: 3 × 4 
# pval pos len nsnp 
# <dbl> <dbl> <dbl> <dbl> 
#1 1e-05 1189.5  2 674 
#2 1e-04 1044.5  1 337 
#3 5e-04 1159.5  2 674 

Wenn dies jedoch nicht der Fall ist, dann können wir Gruppe von aufeinander folgenden pos Werte wie folgt ,

library(dplyr) 
data2 %>% 
    group_by(new = cumsum(c(1, diff(pos) != 1))) %>% 
    summarise(pos = mean(pos), len = sum(len), nsnp = sum(nsnp)) 
# A tibble: 3 × 4 
# new pos len nsnp 
# <dbl> <dbl> <dbl> <dbl> 
#1  1 1044.5  1 337 
#2  2 1159.5  2 674 
#3  3 1189.5  2 674 
0

Sie können einen Datenrahmen d als so Subset:

d[d$variable <= 0.05,] 

Google R refcard nach Möglichkeiten von Datenrahmen subsetting. Lesen Sie eine grundlegende R-Anleitung, um den Rest zu erreichen.

Viel Glück

+0

Ja, ich weiß, dass ich Teilmenge kann. Aber meine Frage ist nicht, wie man Teilmenge, sondern wie man die Operationen erhält, die ich durch aufeinanderfolgende Reihen benötige. – Cebs

Verwandte Themen