ggplot 选择:我应该使用“subset”还是“ifelse”来过滤数据?

问题描述 投票:0回答:3

我正在尝试将来自 2 个不同数据集的两个不同变量的两个密度图绘制在一起。

我的数据集是这样的:

数据集1

Real Wage 1    PPA
1244           105
1577           90
1865           105
1756           105
1634           90
1273           90
2719           105
...            ....

数据集2

Real Wage 2    PPA
1233           105
1588           90
1265           105
1743           105
1224           90
1983           90
2449           105
...            ....

这是我的剧本

ggplot() + 
  geom_density( aes( x = dataset1$`Real Wage 1`), fill = "red",  alpha = 0.5)+
  geom_density( aes( x = dataset2$`Real Wage 2`), fill = "blue", alpha = 0.5)+
  theme_classic()

效果很好,但现在我想根据

Real Wage 1
 的特定值绘制 
Real Wage 2
PPA

的观察结果

当然我不能使用

filter
函数,因为我正在处理两个不同的数据集。 因此,我尝试对每个变量进行子集

ggplot() + 
  geom_density( aes( x = subset(dataset1$`Real Wage 1`, PPA == 105)), fill = "red",  alpha = 0.5)+
  geom_density( aes( x = subset(dataset2$`Real Wage 2`, PPA ==105)), fill = "blue", alpha = 0.5)+
  theme_classic()

但它不起作用,因为(我想 ..)用

$
指定变量我已经排除了所有其他变量,因此子集找不到
PPA
来应用逻辑条件。

我知道可以使用函数

ifelse
过滤数据,但直到现在每次我尝试使用它,它都没有用(可能是因为我无法应用它)。

有人能帮帮我吗?

r if-statement ggplot2 dplyr subset
3个回答
1
投票

ggplot 期望使用数据框而不是向量,并且您还错误地使用了

subset
函数。

这样做的方法是在您的 geom_density 条款中使用以下表格...

+ geom_density(data = subset(dataset1, PPA==105), aes(x = `Real Wage 1`), ...)

1
投票

如果将数据合并到单个长格式数据框中,使用 ggplot 会更容易。例如,您可以按如下方式组合两个数据集:

library(tidyverse)

combined_data <- dataset2 %>%
  rename(`Real Wage` = `Real Wage 2`) %>%
  bind_rows(rename(dataset1, `Real Wage` = `Real Wage 1`), .id = "dataset") %>%
  mutate(dataset = paste("Real Wage", dataset))

combined_data
#>        dataset Real Wage PPA
#> 1  Real Wage 1      1233 105
#> 2  Real Wage 1      1588  90
#> 3  Real Wage 1      1265 105
#> 4  Real Wage 1      1743 105
#> 5  Real Wage 1      1224  90
#> 6  Real Wage 1      1983  90
#> 7  Real Wage 1      2449 105
#> 8  Real Wage 2      1244 105
#> 9  Real Wage 2      1577  90
#> 10 Real Wage 2      1865 105
#> 11 Real Wage 2      1756 105
#> 12 Real Wage 2      1634  90
#> 13 Real Wage 2      1273  90
#> 14 Real Wage 2      2719 105

请注意,所有“实际工资”值都在一列中,所有

PPA
值都在一列中,还有一个新列告诉我们每一行属于哪个“实际工资”数据集。

这意味着我们只需要过滤一次数据,并使代码更容易更改。如果我们将数据集列映射到

fill
美学,我们还会“免费”获得图例。我们可以使用
scale_fill_manual
指定我们想要的特定颜色。这样做可以让图例和情节很好地协同工作:

ggplot(filter(combined_data, PPA == 105), aes(x = `Real Wage`, fill = dataset)) +
  geom_density(alpha = 0.5) +
  scale_fill_manual(values = c("gold", "deepskyblue")) +
  theme_minimal(base_size = 20)

还请注意,与其过滤

PPA
并为每个图创建一个图,您可以使用
facet_grid
并同时完成所有操作,如果您的数据是这样设置的:

ggplot(combined_data, aes(`Real Wage`, fill = dataset)) +
  geom_density(alpha = 0.5) +
  scale_fill_manual(values = c("gold", "deepskyblue")) +
  facet_grid(.~PPA) +
  theme_minimal(base_size = 16)

创建于 2023-02-26 与 reprex v2.0.2


1
投票

不是使用 $ 对变量进行子集化,您可以在将它们传递给 ggplot() 之前对整个数据帧进行子集化。这是一个例子:

library(dplyr)
library(ggplot2)

# Subset the data frames by PPA
dataset1_subset <- dataset1 %>% filter(PPA == 105)
dataset2_subset <- dataset2 %>% filter(PPA == 105)

# Combine the subsets into a single data frame
combined <- rbind(
  data.frame(dataset = "dataset1", value = dataset1_subset$`Real Wage 1`),
  data.frame(dataset = "dataset2", value = dataset2_subset$`Real Wage 2`)
)

# Plot the densities with different colors for each dataset
ggplot(combined, aes(x = value, fill = dataset)) +
  geom_density(alpha = 0.5) +
  scale_fill_manual(values = c("red", "blue")) +
  theme_classic()

此代码首先使用 dplyr 包中的 filter() 通过 PPA == 105 对 dataset1 和 dataset2 进行子集化。然后它将子集组合成一个使用 rbind() 组合的数据框。最后,它将 combined 传递给 ggplot() 并将值映射到 x 轴,将数据集映射到填充颜色。 scale_fill_manual() 函数用于将数据集 1 和数据集 2 的填充颜色分别设置为红色和蓝色。

© www.soinside.com 2019 - 2024. All rights reserved.