我有一个数据框(称之为df),其中包含列' u'和'时间',我通过将它们与分位数进行比较,有条件地在该数据帧的图中着色点。
我目前正在工作
col=ifelse(df$u > quantile(df$u,.98),'orangered2', 'black')
但是我还想添加一个条件:如果前一个点在.95分位数中,并且当前点也是.95分位数,那么将这些点着色为黄色。基本上,如果一行中的两个或多个点大于.95分位数,则突出显示这些点。如果更容易在点和后面的点之间进行比较,那应该基本上是相同的(我认为)。
用其他表示法:
if y(x)>quantile(.98): color red
else if (y(x)>quantile(.95)&y(x+1)>quantile(.95)): color yellow
else if (y(x)>quantile(.94): color purple
我尝试使用lag(),正如我在另一个关于将值与它们之前的值进行比较的问题中所描述的那样
col=ifelse(df$u > quantile(df$u,.98),'orangered2',
ifelse((df$u > quantile(df$u,.95))&(lag(df$u) > quantile(df$u,.95)), 'gold1',
ifelse(df$u > quantile(df$u, .94),'darkorchid3','darkgrey')))
但如果我尝试没有滞后(df $ u)部分的同样的事情,我会得到完全相同的图形,这不是我想要的。我读到了“延迟”,看起来这不是我想要的,但我只是想尝试使用其他问题的答案。
(另外,这是我关于堆栈的第一个问题,所以非常感谢有关如何改进我的问题的评论)
谢谢
答案 0 :(得分:2)
不是最有效的方式,但这是一个说明性的例子。
# simulate data and load `dplyr`
set.seed(47)
df = data.frame(u = rnorm(100))
library(dplyr)
df$color = with(
df,
ifelse(
u > quantile(u, 0.98),
"red",
ifelse(
# for yellow, we have a complex condition
# u must be greater than 0.8 quantile
# AND either one before or one after must also be greater than 0.8 quantile
u > quantile(u, 0.8) & (lag(u) > quantile(u, 0.8) | lead(u) > quantile(u, 0.8)),
"yellow",
ifelse(u > quantile(u, 0.75), "purple", "gray80")
)
)
)
虽然我不喜欢您选择的颜色,但您可以通过
进行验证plot(df$u, col = df$color)
如果我眯着眼睛,我可以看到黄色。