基于session计算obs频率并保留其他条件的R实现需求
R语言:按Session计算观测组合的出现频率
需求说明
需基于session分组,计算每个(session, obs, cond1, cond2, cond3)组合的出现频率(该组合行数占对应session总行数的比例),同时保留原有条件列数据。
示例数据
# 构造示例数据框 data <- data.frame( session = c(1,1,1,1,1,2,2,2,2,2), obs = c("A","A","A","B","C","A","A","A","A","B"), cond1 = c("close","open","close","close","close","close","close","close","close","close"), cond2 = c(30,30,30,30,27,30,30,30,30,30), cond3 = c("0","0","0","10","2","1","6","6","6","2"), stringsAsFactors = FALSE )
原数据预览:
> data session obs cond1 cond2 cond3 1 1 A close 30 0 2 1 A open 30 0 3 1 A close 30 0 4 1 B close 30 10 5 1 C close 27 2 6 2 A close 30 1 7 2 A close 30 6 8 2 A close 30 6 9 2 A close 30 6 10 2 B close 30 2
解决方案
方法1:使用dplyr包(推荐,语法清晰易读)
dplyr是tidyverse系列核心工具,适合新手快速处理数据:
# 未安装则先安装 # install.packages("dplyr") library(dplyr) result <- data %>% # 按目标列分组,统计每个组合的行数 group_by(session, obs, cond1, cond2, cond3) %>% summarise(count = n(), .groups = "drop_last") %>% # 按session计算频率(组合行数/当前session总行数) mutate(freq = count / sum(count)) %>% # 移除中间计数列,保留目标列 select(-count) %>% ungroup() # 查看结果 print(result)
运行结果:
# A tibble: 7 × 6 session obs cond1 cond2 cond3 freq <dbl> <chr> <chr> <dbl> <chr> <dbl> 1 1 A close 30 0 0.4 2 1 A open 30 0 0.2 3 1 B close 30 10 0.2 4 1 C close 27 2 0.2 5 2 A close 30 1 0.2 6 2 A close 30 6 0.6 7 2 B close 30 2 0.2
方法2:使用plyr包(适配你之前的尝试)
如果你习惯用plyr的ddply,可以这样实现:
# 未安装则先安装 # install.packages("plyr") library(plyr) # 先统计每个session的总行数 session_total <- ddply(data, .(session), summarise, total = n()) # 统计组合行数,合并总行数后计算频率 result_plyr <- ddply(data, .(session, obs, cond1, cond2, cond3), summarise, count = n()) %>% merge(session_total, by = "session") %>% mutate(freq = count / total) %>% select(session, obs, freq, cond1, cond2, cond3) %>% arrange(session, obs) print(result_plyr)
结果说明
最终结果中freq列即为目标组合在对应session内的出现频率,完全匹配你需要的输出格式。
内容的提问来源于stack exchange,提问作者Sofia
相关产品推荐
相关产品推荐

