2017-02-23 89 views
0

考虑以下数据条件极值在数据帧:根据定义的条件PMAX值

F1 <- c(1,1,1,0,1) 
F2 <- c(10,20,15,7,20) 
F3 <- c('A', 'D', 'B', 'A', 'A') 
F4 <- c(9,6,20,20,20) 
F5 <- c(2,1,21,8,7) 
df1 <- data.frame(F1,F2,F3,F4,F5) 

df1$F1==1我想获得$F4$F5$F2之间的最大值,但只考虑$F2如果$F3因素AB。否则写NA

df1$max <- with(df1, ifelse(F1==1, pmax(F2[F3_condition],F4,F5), NA)) 

怎么能一个帐户为F3_condition其中ER考虑因素AB

所以$max将采取以下值:c(10,6,21,NA,20)

我已审查了类似question,但它并不完全与我要求的特定条件处理。

回答

2

可以添加另一ifelse使用pmax之前修改F2矢量(替换-Inf对应的值,这将是小于大部分值):

df1$max <- with(df1, ifelse(F1==1, pmax(ifelse(F3 %in% c("A", "B"), F2, -Inf), F4, F5), NA)) 
df1$max 
# [1] 10 6 21 NA 20 

或者,具有NA取代它并在pmax中使用na.rm = T,具体取决于您是否在F4和F5中有NA s:

df1$max <- with(df1, ifelse(F1==1, pmax(ifelse(F3 %in% c("A", "B"), F2, NA), F4, F5, na.rm = T), NA)) 
df1$max 
# [1] 10 6 21 NA 20 
1

如果F4和F5的所有值都是非负的,如在本例中,和F1仅由0和1,则下文中也将工作:

with(df1, pmax(F2 * (F3 %in% c("A", "B")) , F4, F5) * NA^(!F1)) 
[1] 10 6 21 NA 20 

这里,F2 * (F3 %in% c("A", "B"))返回0为F2值,其中F3不是A或B. pmax计算每行中变量的最大值。然后,结果矢量乘以NA^(!F1),当F1!= 0时返回1,当F1 == 0时返回NA。