2016-11-09 45 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 

条件是:

每天

恒苯氧为2

  1. 如果记录天超过305岁苯氧应该保持警惕。

  2. 如果记录小于305,但有下一个记录Pheno应该保留。

  3. 如果记录是小于305和具有它应该被计算为不存在下一记录:305-天*恒定+苯氧=(305 - 260)* 2 + 300

实施例用于动物1这两个记录的数字均小于305。因此,首先记录将成为新的苯氧相同,但塞康纪录是拉斯和具有比305少,所以我们需要重新计算...(305-230)* 2 + 290 = 440

Finaly数据将像:

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 

如何做到这一点在R或Linux的...

+0

什么条件2中的“有下一个记录”是什么意思?条件3:哺乳是否与记录相同? – Bernhard

+0

是的。下一个记录=下一个哺乳期。 Sorr。记录重复 – Andrew

+0

好吧,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依赖于R值在DF,例如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

谢谢!如果每个记录类每天的常量pheno不同,如第一个记录* 2,第二个* 1,5,第三个* 2,3 ......在您的代码中改进这一点是否可行? – 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) 
相关问题