基于另一个数据集绘制基于dplyr的数据集子集的错误

时间:2017-08-21 11:23:30

标签: r ggplot2 dplyr

我有两个数据框df1df2。我想基于两个数据集之间的子集生成堆积条形图。

df1包含两个任意项目之间的距离。

set.seed(123)
df1 <- data.frame(col.x=rep(LETTERS[1:6], each=10), 
                  col.y=rep(LETTERS[1:6], times=10), 
                  dist=runif(60,0,3))
df1 <- df1 %>% filter(!col.x==col.y)
summary(df1)
# col.x col.y      dist        
# A:8   A:8   Min.   :0.07384  
# B:8   B:8   1st Qu.:0.78300  
# C:8   C:8   Median :1.41564  
# D:8   D:8   Mean   :1.54097  
# E:8   E:8   3rd Qu.:2.29776  
# F:8   F:8   Max.   :2.98281  

df2包含与所有这些项目相关联的数据,其中每个项目都包含具有不同值的子项目。

set.seed(123)
df2 <- data.frame(col=sample(LETTERS[1:10],50,replace = T), 
                  ET =sample(c('A1','A2','B3','B6','C5'),50,replace = T),
                  EV =sample(1:8,50,replace = T))
summary(df2)
#      col      ET           EV      
# C      : 7   A1:11   Min.   :1.00  
# E      : 7   A2:10   1st Qu.:2.25  
# J      : 6   B3: 9   Median :4.50  
# B      : 5   B6:13   Mean   :4.58  
# F      : 5   C5: 7   3rd Qu.:6.00  
# G      : 5           Max.   :8.00  
# (Other):15                               

在第一步中,识别到所选项目(2.5)的特定距离(B)内的所有项目。

colY <- df1 %>% filter(col.x=='B' & dist <= 2.5) %>% select(col.y)

在第二步中,将检索这些所选项目的所有相关数据。

datPlot <- df2 %>% filter(col %in% colY$col.y) 

问题1:有没有办法将这些组合成一个dplyr语句?

我试图绘制堆积的条形图,以使用相关值的频率可视化子项目:

datPlot %>% group_by(ET) %>% ggplot(aes(ET)) + geom_bar(aes(fill = EV))

下面的条形图看起来是正确的,但无法生成堆积的条形图。

enter image description here

问题2:上述方法有什么问题?

由于我的原始数据集非常庞大且至少有100M行,我想用最快的方法来解决这个问题。

1 个答案:

答案 0 :(得分:1)

您的fill变量是连续的。把它变成一个因素。您还可以使用semi_join来过滤一个数据帧的行。

datPlot <- df2 %>% semi_join(df1 %>% filter(col.x=='B' & dist <= 2.5), 
                             by = c("col" = "col.y"))

datPlot %>% ggplot(aes(x = ET, fill = as.factor(EV))) + geom_bar()