R语言中按年龄与年份双条件计算婚姻平权反对程度均值及绘制叠加散点图的技术求助
让我来帮你解决这两个问题——先搞清楚双条件筛选出错的原因,再给你一个更高效的实现方案:
一、双条件筛选失效的原因
看你写的代码:
mean(marriage$marriage[marriage$age %in% 18 & marriage$year %in% 1988])
触发unexpected symbol错误大概率是这几个原因:
- 列名大小写不匹配:你开头提到数据框的列是
Year(大写Y),但示例数据和代码里用了year(小写y)。如果实际数据框里列名是Year,那marriage$year会返回NULL,直接导致语法错误。 %in%的误用(非直接错误,但不规范):%in%是用来匹配多个值的(比如age %in% c(18,19,20)),匹配单个值更合适的写法是==,比如marriage$age == 18。虽然%in%对单个值也能运行,但容易让人误解你的意图。- 符号格式错误:如果你的代码里不小心用了中文的
&或者括号不匹配,也会触发这个错误。检查一下所有符号是不是英文半角的。
二、更高效的计算与绘图方法
手动逐个计算均值再拼数据框太繁琐,用dplyr分组计算+ggplot2绘图是最便捷的方案,一步到位:
1. 先加载需要的包
library(dplyr) library(ggplot2)
2. 分组计算每个年龄+年份的平均反对程度
按年份和年龄分组,直接算出均值:
# 注意:如果你的列名是小写的year/age/marriage,把下面的大写改成小写就行 mean_marriage <- marriage %>% group_by(Year, Age) %>% summarise(avg_marriage = mean(Marriage, na.rm = TRUE)) %>% # na.rm用来忽略缺失值 ungroup()
3. 绘制叠加散点图
用ggplot2直接把两年的散点画在一起,还能自动处理图例:
ggplot(mean_marriage, aes(x = Age, y = avg_marriage, color = factor(Year))) + geom_point(size = 2) + # 调整散点大小 labs( x = "年龄", y = "平均婚姻平权反对程度", color = "年份", title = "不同年份各年龄层的婚姻平权平均反对程度" ) + scale_color_manual(values = c("1988" = "navy", "2010" = "coral")) + # 自定义颜色 theme_minimal() # 用简洁的主题
如果你习惯用基础R实现
不用tidyverse包的话,也可以用tapply快速分组计算:
# 计算各组合的均值 mean_marriage <- tapply(marriage$Marriage, list(marriage$Year, marriage$Age), mean, na.rm = TRUE) # 转换成数据框格式 mean_marriage_df <- as.data.frame.table(mean_marriage, responseName = "avg_marriage") colnames(mean_marriage_df) <- c("Year", "Age", "avg_marriage") # 绘制散点图 plot(avg_marriage ~ Age, data = subset(mean_marriage_df, Year == 1988), col = "navy", pch = 16, xlab = "年龄", ylab = "平均反对程度", main = "不同年龄层的婚姻平权平均反对程度") points(avg_marriage ~ Age, data = subset(mean_marriage_df, Year == 2010), col = "coral", pch = 16) legend("topright", legend = c("1988", "2010"), col = c("navy", "coral"), pch = 16)
内容的提问来源于stack exchange,提问作者Alpaca Paw
相关产品推荐
相关产品推荐

