首页 文章

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

提问于
浏览
1

我有两个数据帧 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

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

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 回答

  • 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()
    

相关问题