如何在R中按年龄分组统计不同词提示的联想词频率?
解决方案:按年龄分组统计不同提示下的联想词频率
我来帮你解决这个按年龄分组统计不同提示下联想词频率的问题,这里有两种常用的方法,你可以根据自己的习惯选择:
第一步:先创建年龄分组列
首先需要把你的原始数据中的年龄转换成指定的三个分组(15-30、31-45、46-60),假设你的数据框testdata里有一个名为age的列记录参与者年龄,用以下代码生成分组:
# 创建年龄分组列 testdata$age_group <- cut(testdata$age, breaks = c(14, 30, 45, 60), labels = c("15-30", "31-45", "46-60"), include.lowest = TRUE)
breaks设置分组的分界点,14确保15岁被包含在第一个组labels指定每个分组的名称,和你需要的列名格式匹配include.lowest = TRUE保证最小的年龄值(15)被包含在第一个组中
方法一:用Tidyverse(dplyr + tidyr)批量处理(推荐)
这个方法代码更简洁,适合批量处理所有提示,不需要逐个手动处理:
library(dplyr) library(tidyr) # 1. 分组统计每个提示、年龄组下的联想词频率 freq_summary <- testdata %>% group_by(prompt, age_group, typedWord) %>% summarise(freq = n(), .groups = "drop") # 统计每个组合的出现次数 # 2. 将数据转换为宽格式,生成你需要的列名(比如freqMedia15-30) wide_freq_table <- freq_summary %>% mutate(col_name = paste0("freq", prompt, age_group)) %>% # 拼接列名 select(-prompt, -age_group) %>% pivot_wider(names_from = col_name, values_from = freq, values_fill = 0) # 转宽格式,缺失值填0 # 3. 将频率列合并回原始数据(如果需要在原数据中查看每个词的对应频率) testdata_with_freq <- testdata %>% left_join(wide_freq_table, by = "typedWord")
完成后,testdata_with_freq中就会包含所有类似freqMedia15-30、freqFood31-45的列,每个列对应指定提示和年龄组下该联想词的出现频率。
方法二:用Base R循环处理
如果你习惯使用Base R,也可以通过循环遍历所有提示和年龄组的组合来实现:
# 1. 先创建年龄分组(同第一步) testdata$age_group <- cut(testdata$age, breaks = c(14, 30, 45, 60), labels = c("15-30", "31-45", "46-60"), include.lowest = TRUE) # 2. 生成所有提示和年龄组的组合 prompt_age_combinations <- expand.grid( prompt = unique(testdata$prompt), age_group = unique(testdata$age_group), stringsAsFactors = FALSE ) # 3. 循环处理每个组合,计算频率并合并到原始数据 for (i in 1:nrow(prompt_age_combinations)) { current_prompt <- prompt_age_combinations$prompt[i] current_age_group <- prompt_age_combinations$age_group[i] # 筛选当前提示和年龄组的数据 subset_data <- subset(testdata, prompt == current_prompt & age_group == current_age_group) # 计算词频并转换为数据框 freq_df <- as.data.frame(table(subset_data$typedWord)) # 重命名列:第一列为typedWord,第二列为目标列名 names(freq_df) <- c("typedWord", paste0("freq", current_prompt, current_age_group)) # 将频率列合并回原始数据,all.x=TRUE保留所有原始行 testdata <- merge(testdata, freq_df, by = "typedWord", all.x = TRUE) } # 4. 将缺失值(未出现的词)替换为0 testdata[is.na(testdata)] <- 0
这样处理后,testdata中就会生成所有你需要的频率列,每个列对应一个提示+年龄组的组合。
内容的提问来源于stack exchange,提问作者Andrea Dioni
相关产品推荐
相关产品推荐

