2017-02-16 8 views
0

Ich habe derzeit einen Datensatz mit Alter und CPUE. Ich muß eine Schleife bilden (oder eine anderen Code)Durchschleifen Quantile, um eindeutige Spalte in Datensatz

  1. Subset in einzigartige Daten der Datenrahmen
  2. für jeden eindeutigen Altersrahmen, den Perzentil-Wert von 10 bis 90 um 1% CPUE
  3. finden fügen jedes Perzentil CPUE Wert zu dem Datensatz (ob durch Alter von Alter oder identifiziert subsetted) als neue Spalte
  4. eine weitere Spalte hinzufügen, basierend auf der Schwelle CPUE, die zu einer ifelse Aussage ähnlich sein würde, wo die Spalte, die Sie, wenn die sagen würde, CPU-Schwelle wurde erreicht oder nicht.

Der Code, den ich bisher habe, ist nicht geschleift und sieht wie folgt aus:

#####subsetting for each age 
    yr1=ycsnew[which(ycsnew$age==1),] 
    yr2=ycsnew[which(ycsnew$age==2),] 
    yr3=ycsnew[which(ycsnew$age==3),] 
    yr4=ycsnew[which(ycsnew$age==4),] 
    yr5=ycsnew[which(ycsnew$age==5),] 
    yr6=ycsnew[which(ycsnew$age==6),] 
    yr7=ycsnew[which(ycsnew$age==7),] 

    ####creating a vector using for example the 80th percentile (I would like 
    this to be continuous from 0.1 to 0.9 by 0.01) 
    q1=quantile(yr1$logcpueplus1,0.8)[[1]] 
    q2=quantile(yr2$logcpueplus1,0.8)[[1]] 
    q3=quantile(yr3$logcpueplus1,0.8)[[1]] 
    q4=quantile(yr4$logcpueplus1,0.8)[[1]] 
    q5=quantile(yr5$logcpueplus1,0.8)[[1]] 
    q6=quantile(yr6$logcpueplus1,0.8)[[1]] 
    q7=quantile(yr7$logcpueplus1,0.8)[[1]] 

    ####using ifelse statement to create column for probability greater than 
    or equal to percentile value (pgtq8=ProbabilityGreaterThanQ80) 
    yr1$pgtq8=ifelse(yr1$logcpueplus1>=q1,1,0) 
    yr2$pgtq8=ifelse(yr2$logcpueplus1>=q2,1,0) 
    yr3$pgtq8=ifelse(yr3$logcpueplus1>=q3,1,0) 

    ##then I ended up binding everything back together 
    ycsnew2=rbind(yr1,yr2,yr3,yr4,yr5,yr6,yr7) 

ich den Prozess begann, mich von Looping und haben so weit gekommen:

###1 subset into different year datasets 
    age_split=split(ycsnew,ycsnew$age) 
    new_names <- c("one", "two", "three","four","five","six","seven") 
    for (i in 1:length(age_split)) { 
     assign(new_names[i], age_split[[i]]) 
    } 

    ###for each age, loop through to get values for 0.1-0.9 by0.01 
    N=(seq(0.1,0.9,0.01)) 
    one_percentiles=matrix(rep("puppy",81),nrow=81,ncol=1) 
    sequence1=c(seq(0.1,0.9,0.01)) 
    for(n in unique(seq(1,81,1))){ 
     for(i in sequence1){ 
     ps=quantile(one$logcpueplus1,i)[[1]] 
     one_percentiles[[n]]=ps 

     } 
    } 

I Ich stehe jetzt fest, weil der "i" -Wert das Objekt "sequenz1" nicht korrekt durchläuft und ich einfach eine Matrix "one_percentiles" mit dem Quantilwert für nur i = 0.1 oder i = 0.9 erhält.

Ich werde auf jeden Fall ratlos sein, wenn ich die ifelse() -Anweisung durch eine Schleife auf den Datensatz als neue Spalte hinzufügen werde, so dass jede Einsicht sehr geschätzt wird.

Mein Datensatz ist unten.

logcpueplus1 age 
1  0.13353139 7 
2  0.13353139 6 
3  0.06899287 2 
4  0.08004271 1 
5  0.13353139 6 
6  0.06899287 7 
7  0.04879016 4 
8  0.04879016 4 
9  0.13353139 7 
10 0.06899287 7 
12 0.06899287 6 
13 0.06899287 2 
14 0.06899287 2 
15 0.06899287 7 
16 0.06899287 6 
17 0.09531018 4 
21 0.13353139 7 
22 0.18232156 4 
24 0.04879016 4 
25 0.09531018 4 
26 0.06899287 2 
28 0.06899287 7 
30 0.04879016 4 
37 0.08004271 1 
39 0.04879016 4 
40 0.08004271 1 
41 0.13353139 6 
42 0.25131443 6 
43 0.13353139 7 
44 0.04879016 4 
47 0.08004271 1 
49 0.04879016 4 
50 0.13353139 5 
52 0.19415601 6 
53 0.13353139 7 
54 0.19415601 6 
55 0.30538165 5 
56 0.04879016 3 
57 0.06899287 1 
59 0.06899287 6 
60 0.35667494 5 
61 0.09531018 3 
63 0.19415601 6 
64 0.25131443 5 
65 0.09531018 3 
66 0.06899287 6 
67 0.19415601 6 
69 0.06899287 1 
70 0.13976194 3 
71 0.13353139 5 
73 0.04879016 3 
77 0.06899287 6 
78 0.04879016 3 
79 0.06899287 7 
+0

Ich verfolge nicht all Ihre Perzentils Zeug. Können Sie einen einzelnen Wert von "Alter" wählen, sagen "Alter = 1", und zeigen Sie das Ergebnis, das Sie für dieses Alter wollen? – Gregor

Antwort

0

Dies ist, was ich am Ende mit und alle meine Bedürfnisse anzupassen.

ycsB=ycsnew 
dim(ycsnew) 
names(ycsB) 
see2=(seq(0.1,0.9,0.01)) 

ycsB[, 21:(21+length(see2)-1)]=NA 
names(ycsB) 
ages=unique(ycsnew$age) 

for(s in 1:length(see2)){ 

    quant_name=see2[s] 

for(b in 1:length(ages)){ 

    age_subset=subset(ycsB, ycsB$age==ages[b]) 
    age_quantile= quantile(age_subset$logcpueplus1,quant_name) 

    ycsB[which(ycsB$age==ages[b]), (26+s)]=age_quantile 
    for(j in 1:length(ages)){ 

     if_s=ifelse(age_subset$logcpueplus1>=age_quantile,1,0) 
     ycsB[which(ycsB$age==ages[b]), (107+s)]=if_s 
     } 
    } 
} 
1

Mit dplyr und wo df ist Ihr Datenrahmen.

library(dplyr) 
df <- df %>% group_by(age) %>% 
    mutate(q = quantile(logcpueplus1,0.8), 
      pgtq8 = ifelse(logcpueplus1 >= q,1,0)) 
df 
#Source: local data frame [54 x 4] 
#Groups: age [7] 
# logcpueplus1 age   q  pgtq8 
# <dbl>   <int>  <dbl> <dbl> 
#1 0.13353139  7  0.13353139  1 
#2 0.13353139  6  0.19415601  0 
#3 0.06899287  2  0.06899287  1 
#4 0.08004271  1  0.08004271  1 
#5 0.13353139  6  0.19415601  0 
#6 0.06899287  7  0.13353139  0 
#7 0.04879016  4  0.09531018  0 
#8 0.04879016  4  0.09531018  0 
#9 0.13353139  7  0.13353139  1 
#10 0.06899287  7  0.13353139  0 
# ... with 44 more rows 
+0

Das ist, was ich gesucht habe, wenn ich genug Punkte hätte, würde ich darüber abstimmen. – hcg

0

Hier ist eine Option mit data.table

library(data.table) 
setDT(df1)[, q := quantile(logcpueplus1, 0.8), age 
      ][, pgtq8 := as.integer(logcpueplus1 >= q)][]