R 将单个点与其前面的点进行比较
我有一个数据框(称之为df),其中有“u”和“time”列,我通过将这些点与分位数进行比较,有条件地给这个数据框的图中的点上色 我目前正在工作R 将单个点与其前面的点进行比较,r,R,我有一个数据框(称之为df),其中有“u”和“time”列,我通过将这些点与分位数进行比较,有条件地给这个数据框的图中的点上色 我目前正在工作 col=ifelse(df$u > quantile(df$u,.98),'orangered2', 'black') 但是我还想添加一个条件:如果前面的点在.95分位数,而当前的点也在.95分位数,那么把这些点涂成黄色。基本上,如果一行中的两个或多个点大于.95分位数,则突出显示这些点。如果在这一点和后面的点之间写一个比较比较容易,那么基本上应
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)部分,我会得到完全相同的图,这不是我想要的。我读了《滞后》,似乎这不是我想要的,但我只是想用另一个问题的答案
(此外,这是我在stack上的第一个问题,因此非常感谢您对如何改进我的问题的评论)
谢谢这不是最有效的方法,但这里有一个说明性的例子
# 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)
如果我斜视正确,我可以看到黄色。
stats::lag
是为时间序列数据构建的,但是dplyr::lag
可能更符合您的要求。关于如何改进问题,请尝试使用虚拟数据包含一个样本data.frame
,以及另一个显示预期结果/期望结果的data.frame
。类似于set.seed(47);df=data.frame(u=rnorm(100))
是一种方便、重复地共享数据的好方法。出于说明目的,您可能还希望降低阈值,以便使用较小的随机数据,很有可能一行中有两个点落在分位数阈值之外。例如,对于100个随机正常点,您仍然可以将0.98保留为红色,但黄色可能使用0.80,紫色可能使用0.75。加载dplyr
(library(dplyr)
)或使用双冒号调用它,dplyr::lag()
。非常好,这非常好。我还将颜色改为适合眼球的颜色:橙色2、金色1、暗红色3和暗灰色,所有颜色都在黑色背景上。