2017-02-16 2 views
0

В настоящее время у меня есть набор данных с возрастом и CPUE. Мне нужно сделать петлю (или другой код), чтобыцикл через квантили, чтобы создать уникальный столбец в наборе данных

  1. подмножества кадра данных в уникальные кадры данных
  2. для каждого уникального возраста, найти значение процентиля от 10 до 90 на 1% CPUE
  3. добавьте каждое процентильное значение CPUE в набор данных (подмножество по возрасту или по возрасту) в качестве нового столбца
  4. добавьте еще один столбец, основанный на пороге cpue, который будет похож на оператор ifelse, где столбец скажет вам, cpue threshold был встречен или нет.

кода я до сих пор не является петельным и выглядит следующим образом:

#####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) 

Я начал процесс зацикливания себя, и получил это далеко:

###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 я теперь застреваю, потому что значение «i» не зацикливается на объекте «sequence1» правильно, и я просто получаю матрицу «one_percentiles», заполненную значением квантиля только для i = 0,1 или i = 0,9.

Я определенно буду в тупик с добавлением инструкции ifelse() через цикл в набор данных как новый столбец, так что любое понимание будет оценено по достоинству.

Мой набор данных находится ниже.

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

Я не следую всем вашим материалам процентиля. Можете ли вы выбрать одно значение «возраст», например «age = 1» и показать результат, который вы хотите для этого возраста? – Gregor

ответ

0

Это то, что я в конечном итоге использование и подходит для всех моих потребностей.

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

Использование dplyr и где df ваш dataframe.

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

Это то, что я искал, если бы у меня было достаточно очков, я бы проголосовал за это. – hcg

0

Вот вариант использования data.table

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