我有两个数据框df1
和df2
。我想基于两个数据集之间的子集生成堆积条形图。
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))
下面的条形图看起来是正确的,但无法生成堆积的条形图。
问题2:上述方法有什么问题?
由于我的原始数据集非常庞大且至少有100M行,我想用最快的方法来解决这个问题。
答案 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()