数据帧中的条件最大值:基于定义条件的pmax值

时间:2017-02-23 15:23:42

标签: r max

考虑以下数据

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因素,则仅考虑$F3AB。否则请写NA

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

如何考虑因素F3_conditionA而考虑B的哪个帐户?

因此$max将采用以下值:c(10,6,21,NA,20)

我已经审核过类似的question,但它并不完全符合我要求的具体情况。

2 个答案:

答案 0 :(得分:2)

您可以在使用ifelse之前添加另一个F2来修改pmax向量(将相应的值替换为-Inf,它将小于大多数值):< / p>

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并使用na.rm = T中的pmax,具体取决于您在F4和F5中是否有NA

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 :(得分: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"))为F2值返回0,其中F3不是A或B. pmax计算每行中变量的最大值。然后,结果向量乘以NA^(!F1),当F1!= 0时返回1,当F1 == 0时返回NA。