2016-11-09 14 views
0

条件を使ってデータから新しい変数を計算する必要があります。新しいPheno。 データセットが巨大です。 私は、データセットがあります:動物、録音、日、フェノ条件の間で新しい変数を作る方法

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

は条件は以下のとおりです。レコード日間以上305古いフェノある場合は一日あたり

定数フェノは2

  1. ですkeeptする必要があります。

  2. レコードが305未満ですが、次のレコードがある場合は、Phenoをkeeptにする必要があります。

  3. レコードは305未満、それは次のように計算されるべきでない次のレコードがない場合:*定数+のフェノ= 305日間 - 動物1(305 260)* 2 + 300

例どちらのレコードでも305未満です。したがって、最初のレコードは新しいフェノで同じになりますが、seconレコードはlasで305未満です。したがって、再計算する必要があります...(305-230)* 2 + 290 = 440

最終データは以下のような:

RまたはLinuxでそれを行う方法を
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 

...

+0

何条件2の「次のレコードを持っていますか」という意味ですか?条件3:泌乳は記録と同じですか? – Bernhard

+0

うん。次の記録=次の授乳。ソーラー。レコードが繰り返されます – Andrew

+0

ok、380、今編集中 – Andrew

答えて

0

チェックこれを(私はRは、ソートされたレコードの数であると仮定し、あなたが持っている場合は10が最後になりますレコード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 

事前定義されたco例えば、DFにR値に依存nstants:

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

はあなたがここconst[R]

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

ありがとう!最初のレコード* 2、2番目の* 1,5、3番目の* 2,3のように、レコードクラスごとに1日あたり一定のフェノが異なる場合は、コード内でこれを改善する可能性はありますか? – Andrew

+0

定数が** 2 * x **のような別の値に依存する場合、xはレコードに依存します。また、制限がある場合はベクトルで事前定義できます。 – OmaymaS

+0

この要素は何に依存していますか? – OmaymaS

0

によってコードにRを置き換えることができますが、ベース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) 
関連する問題