2016-11-09 2 views
0

Ich muss neue Variable aus Daten mit Bedingungen berechnen. Neuer Pheno. Datensatz ist riesig. Ich habe Datensatz: Tier, Nehmen, Tage, PhenoWie man eine neue Variable über Bedingungen hinweg erstellt

A R D P 
1 1 240 300 
1 2 230 290 
2 1 305 350 
2 2 260 290 
3 1 350 450 

Bedingungen sind:

Constant Phäno pro Tag 2.

  1. ist Wenn Rekord Tage mehr als 305 alte Phäno ist sollte gehalten werden.

  2. Wenn der Datensatz kleiner als 305 ist, aber die nächsten Datensätze haben, sollte Pheno beibehalten werden.

  3. Wenn Datensatz weniger als 305 und haben keine nächsten Aufzeichnungen sollte wie folgt berechnet: 305 Tage * Konstante + Phäno = - 1 (305 260) * 2 + 300

Beispiel für Tier für beide Datensätze weniger als 305 haben. Also wird First record gleich sein in new pheno, aber secon record ist las und hat weniger als 305, also müssen wir neu berechnen ... (305-230) * 2 + 290 = 440

Endgültige Daten werden wie:

A R D P N_P 
1 1 240 300 300 
1 2 230 290 440 
2 1 305 350 350 
2 2 260 290 380 
3 1 350 450 450 

Wie es in R oder linux zu tun ...

+0

Was genau hat "hat nächste Aufzeichnungen" in Bedingung 2 bedeutet? In Zustand 3: Ist eine Laktation die gleiche wie eine Aufzeichnung? – Bernhard

+0

Ja. Nächster Datensatz = nächste Laktation. Sorr. Datensätze werden wiederholt – Andrew

+0

ok, 380, jetzt bearbeitet – Andrew

Antwort

0

Check this out (ich nehme an R die Anzahl der Datensätze sortiert, also, wenn Sie 10 Datensätze haben die letzte wird R = 10)

library(dplyr) 

df <- data.frame(A=c(1,1,2,2,3), 
     R=c(1,2,1,2,1), 
     D=c(240,230,305,260,350), 
     P=c(300,290,350,290,450)) 



df %>% group_by(A) %>% 
     mutate(N_P=ifelse((D<305 & R==n()), # check if D<305 & Record is last record 
          ((305-D)*2)+P  # calculate new P 
          ,P))    # Else : use old P 

Source: local data frame [5 x 5] 
Groups: A [3] 

     A  R  D  P N_P 
    <dbl> <dbl> <dbl> <dbl> <dbl> 
1  1  1 240 300 300 
2  1  2 230 290 440 
3  2  1 305 350 350 
4  2  2 260 290 380 
5  3  1 350 450 450 

Wenn Sie vordefinierte co nstants, die in der df auf R-Wert abhängig ist, zum Beispiel:

const <- c(1,2,1.5,2.5,3) 

Sie R durch const[R] im Code ersetzen kann

df %>% group_by(A) %>% 
    mutate(N_P=ifelse((D<305 & R==n()), # check if D<305 & Record is last record 
         ((305-D)*const[R])+P  # calculate new P 
         ,P))    # Else : use old P 
+0

Danke! Wenn konstante pheno pro Tag für jede Datensatzklasse unterschiedlich ist, wie erste Datensätze * 2, zweite * 1,5, dritte * 2,3 ... Ist es möglich, dies in Ihrem Code zu verbessern? – Andrew

+0

Wenn die Konstante von einem anderen Wert wie ** 2 * x ** abhängt, wobei x vom Datensatz abhängt, oder wenn es sich um eine begrenzte Auswahl handelt, können Sie sie in einem Vektor vordefinieren. – OmaymaS

+0

Worauf hängt dieser Faktor ab? – OmaymaS

0

Hier ist eine Lösung mit Basis R

df <- read.table(header=TRUE, text= 
"A R D P 
1 1 240 300 
1 2 230 290 
2 1 305 350 
2 2 260 290 
3 1 350 450") 

newP <- function(d) { 
    np <- numeric(nrow(d)) 
    for (i in 1:nrow(d)) { 
    if (d$D[i] > 305) { np[i] <- d$P[i]; next } 
    if (d$D[i] <= 305 && i<nrow(d)) { np[i] <- d$P[i]; next } 
    np[i] <- (305-d$D[i])*2 + d$P[i] 
    } 
    d$N_P <- np 
    return(d) 
} 

D <- split(df, df$A) 
D2 <- lapply(D, newP) 
do.call(rbind, D2) 
Verwandte Themen