2017-02-23 88 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。