考虑以下数据
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
是A
或B
。否则请写NA
df1$max <- with(df1, ifelse(F1==1, pmax(F2[F3_condition],F4,F5), NA))
如何考虑因素F3_condition
或A
而考虑B
的哪个帐户?
因此$max
将采用以下值:c(10,6,21,NA,20)
我已经审核过类似的question,但它并不完全符合我要求的具体情况。
答案 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。