如何在条件

时间:2016-11-09 11:24:48

标签: r variables conditional-statements

我需要使用条件从数据中计算新变量。新的Pheno。 数据集很大。 我有数据集:Animal,Record,Days,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

  4. 两种记录的动物1的实例少于305。所以第一条记录在新的现象中是相同的,但是secon记录是las并且小于305,所以我们需要重新计算......(305-230)* 2 + 290 = 440

    最终数据如下:

    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中完成...

2 个答案:

答案 0 :(得分: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

如果您有预定义的常量,这些常量取决于df中的R值,例如:

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

您可以在代码中用const[R]

替换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

答案 1 :(得分:0)

这是一个基础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)