我需要使用条件从数据中计算新变量。新的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。
如果记录天数超过305,那么应该保留现象。
如果记录小于305但有下一个记录,应该保留Pheno。
如果记录小于305并且没有下一条记录,则应计算为:305天*常数+现象=(305 - 260)* 2 + 300
两种记录的动物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中完成...
答案 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]
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)