You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:45:42