2017-10-08 82 views
0

我想创建一个barplot,显示按单身或结婚分组的大学毕业生或非大学毕业生分组的工会和非工会工人的平均小时工资。虽然我设法构建了具有两个因素分组的可通过的barplot,但我无法弄清楚如何使用三个因子分组来完成此操作。我所看到的例子有三个因素只是频率计数,所以我不确定如何将所有因素中的另一个变量的平均值并入到图中。我所希望创造的东西,看起来像这样(在Stata创建): Average Hourly Wage by Union Status, Marital Status, and College Graduation 我的代码如下所示:具有多个因素分组和多变因子均值的水库群

levelbar = tapply(wage, list(as.factor(union), as.factor(married), 
as.factor(collgrad)), mean) 
par(mfrow = c(1, 2)) 
barplot(levelbar, beside = TRUE) 
barplot(t(levelbar), beside = TRUE) 

当我运行这一点,但是,我收到错误:

Error in barplot.default(levelbar, beside = TRUE) : 
'height' must be a vector or a matrix 

任何帮助,将不胜感激。我敢肯定,ggplot可能在这里很有用,但我没有很多使用该软件包的经验。

回答

0

这是一个使用ggplot和内置数据集泰坦尼克号的可重现示例。

请注意,我们首先计算平均值,并使用stat = identity来确保我们将这些数据导入到图中。

# Format the Titanic dataframe 
Titanic_df <- Titanic %>% as_tibble() 

# Make Class, Sex, Age, and Survived factors 
for (col in c("Class", "Sex", "Age", "Survived")) { 
    Titanic_df[[col]] <- factor(Titanic_df[[col]]) 
} 

# Get by group means 
means <- Titanic_df %>% 
    group_by(Class, Sex, Survived) %>% 
    summarise(
    mean_n = mean(n) 
) 

# Plot: facets are the Classes, bar colors are the two Sexes, and the groupings in each facet are Survived vs. Not Survived 
ggplot(data = means) + 
    geom_bar(aes(x = Survived, y = mean_n, fill = Sex), stat = "identity", position = "dodge") + 
    facet_wrap(~ Class) 

enter image description here

+0

谢谢!如果我想消除第三列出现b/c联盟因素水平有NAs,我会在那里?我试过 '意味着<- nlsw_df %>% na.omit()%>% GROUP_BY(工会,已婚,collgrad)%>% 总结( mean_wage =平均值(工资) )' 我试着 'ggplot(数据= na.omit(单元))+ geom_bar(AES(X = collgrad,Y = mean_wage,填充=联盟),STAT = “同一性”,位置= “躲闪”)+ facet_wrap( 〜已婚) 我试过 '(col in c(“union”,“married”,“collgrad”)){ nlsw_df [[col]] < - factor(nlsw_ df [[col]],exclude = NA) }' –

+0

尽管您已经清除了NA值,但仍然存在NA因素级别。在na.omit()'(或'drop_na(union)'后面连接'droplevels()',如果你只想在union列中放弃NAs行)应该做到这一点。 – amanda

+0

嗨阿曼达, 感谢您的答复。我认为你说得对,这是正确的做法,但由于某种原因,我无法实现它。尽管在na.omit()之后链接了小滴(),但第三个未使用的NA小节仍然显示在图上。我已经运行的代码是: '意味着<- nlsw_df %>% na.omit(工会)%>% droplevels(工会)%>% GROUP_BY(工会,已婚,collgrad)%>% 总结( mean_wage =平均(工资) ) ggplot(数据=单元)+ geom_bar(AES(X = collgrad,Y = mean_wage,填充=联盟),STAT = “同一性”,位置= “躲闪”)+ facet_wrap(〜已婚)' –