【问题标题】:Subset a dataframe using data from another dataframes使用来自另一个数据帧的数据子集数据帧
【发布时间】:2020-07-21 14:29:54
【问题描述】:

我有一个散点图,我希望能够过滤该散点图的数据。

您在这张图片中看到了四个地块。 1) 中间绿色曲线,2) 上黑色曲线,3) 下黑色曲线,4) 蓝色散点图。

我以数据框的形式拥有所有这些:

蓝色散点图:

df <- mtcars
geom_point(df, aes(x,y), color = 'blue')

绿色曲线:

geom_smooth(formula=y~x, method='loess', color='green3', se=FALSE, size=0.5)

上曲线:

geom_smooth(formula=y+1~x, method='loess', color='gray20', se=FALSE, size=0.5)

下曲线

geom_smooth(formula=y-1~x, method='loess', color='gray20', se=FALSE, size=0.5)

我想用黑色曲线过滤蓝色数据点,这样只有蓝色数据点应该在这两条黑色线之间,并且应该删除异常值。

我尝试使用whichfilterSubset 函数。但是,它不起作用,它没有呈现我想要的输出。

最后,我想要位于这两条黑线之间的散点数据。

【问题讨论】:

  • 您能否添加用于生成绘图的数据框和 R 代码?否则不清楚如何提供解决方案
  • 我是新手,你能告诉我,如何在我的问题中添加数据框。我在 CSV 文件中有所有 4 个数据框。仅供参考:数据框很大。
  • 在那种情况下,你能定义3条曲线吗?他们有一个特定的方程式吗?
  • 不,它们没有特定的公式。
  • 那么它们是如何生成的?

标签: r ggplot2 dplyr shiny


【解决方案1】:

虽然我们没有您的特定数据集,但这里有一种基于使用 mtcars 数据集的方法。首先,让我们画一个类似于 OP 分享的图:

df <- mtcars

ggplot(df, aes(disp, mpg)) + theme_bw() +
  geom_point(color='gray60') +
  geom_smooth(formula=y~x, method='loess', color='green3', se=FALSE, size=0.5) +
  geom_smooth(formula=y+1~x, method='loess', color='gray20', se=FALSE, size=0.5) +
  geom_smooth(formula=y-1~x, method='loess', color='gray20', se=FALSE, size=0.5)

如您所见,上行和下行分别是通过在公式的 y 值上添加 +1 或 -1 来创建的。

我们在这里采用的方法是为数据集中的每个 x 值(df$mpg 的每个值)定义使用 loess() 方法预测的“上”和“下”线。然后,我们可以使用这些值与每个给定 df$mpg 的实际值 df$disp 进行比较,以确定它是在“内部”还是“外部”这些限制。

一、上下线的公式,以及上下值的预测:

fla_upper <- loess(formula=mpg+1 ~ disp, mtcars)
fla_lower <- loess(formula=mpg-1 ~ disp, mtcars)

df$upper <- predict(fla_upper, newdata=df)
df$lower <- predict(fla_lower, newdata=df)

现在我们可以创建一个df$region 列来描述每个点在数据集中的位置:

df$region <- ifelse(df$mpg <= df$upper & df$mpg >= df$lower, 'inside','outside')

最后,要创建情节,我们可以使用df$region 来进行颜色美学。我还在这里明确定义了美学的颜色,因为默认配色方案不能清楚地说明这一点:

ggplot(df, aes(disp, mpg)) + theme_bw() +
  geom_point(aes(color=region)) +
  geom_smooth(formula=y~x, method='loess', color='green3', se=FALSE, size=0.5) +
  geom_smooth(formula=y+1~x, method='loess', color='gray20', se=FALSE, size=0.5) +
  geom_smooth(formula=y-1~x, method='loess', color='gray20', se=FALSE, size=0.5) +
  scale_color_manual(values=c('inside'='red', 'outside'='gray80'))

要完全过滤掉那些“外部”点,您可以使用subset() 并将其应用于geom_point() 数据字段:

ggplot(df, aes(disp, mpg)) + theme_bw() +
  geom_point(data=subset(df, region=='inside'), color='red') +
  geom_smooth(formula=y~x, method='loess', color='green3', se=FALSE, size=0.5) +
  geom_smooth(formula=y+1~x, method='loess', color='gray20', se=FALSE, size=0.5) +
  geom_smooth(formula=y-1~x, method='loess', color='gray20', se=FALSE, size=0.5)

现在,在应用到您自己的数据时,您可以使用类似的方法。但是,您定义了绘制上线和下线,只需将该公式应用于数据集中的 x 值即可创建“上”和“下”区域。然后将实际的 y 值与预测的上限和下限进行比较。

【讨论】:

  • 谢谢你这么详细的回答,我会试试你的方法。这肯定很有帮助。
  • 我可以对“lm”而不是“loess”使用相同的方法吗?
  • 没有理由你不能这样做。只需更改与geom_smooth 一起使用的方法来绘制该线的图,显然使用lm() 而不是loess()
猜你喜欢
  • 2017-11-10
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2015-12-31
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
相关资源
最近更新 更多