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

如何在R中基于全局code频率为data.frame的name分配对应code

解决方法

可以用dplyr包实现,步骤清晰且代码简洁:

完整代码(dplyr版本)

library(dplyr)

# 原始数据
mydat <- data.frame(name = c("James", "James", "James", "James", "Leila", "Leila", "Cici", "Bob", "Bob", "Holly", "Topaz", "Topaz"),
                    code = c(123, 928, 981, 333, 981, 928, 463, 123, 928, 981, 333, 444))

final_mydat <- mydat %>%
  # 给每条数据添加对应code的全局出现次数
  add_count(code, name = "global_freq") %>%
  # 按name分组,筛选出该用户关联code中全局频率最高的记录
  group_by(name) %>%
  filter(global_freq == max(global_freq)) %>%
  # 去重,避免同一用户下重复的code
  distinct(name, code) %>%
  # 重命名列名匹配预期输出
  rename(final_code = code) %>%
  ungroup()

# 查看结果
final_mydat

结果说明

  • add_count(code, name = "global_freq"):自动计算每个code的全局出现次数并添加为新列
  • group_by(name):按用户分组处理
  • filter(global_freq == max(global_freq)):仅保留当前用户关联code中全局频率最高的条目
  • distinct(name, code):去除同一用户下重复的code记录(比如James的928和981各保留一条)

运行后输出与预期一致:

# A tibble: 8 × 2
  name  final_code
  <chr>      <dbl>
1 James        928
2 James        981
3 Leila        981
4 Leila        928
5 Cici         463
6 Bob          928
7 Holly        981
8 Topaz        333

基础R版本(无需额外包)

如果不想加载dplyr,可以用基础R实现:

# 计算全局code频率
code_freq <- table(mydat$code)

# 按name拆分code列表
name_code_list <- split(mydat$code, mydat$name)

# 遍历每个用户,筛选出其关联code中全局频率最高的项
result_list <- lapply(name_code_list, function(codes) {
  current_freq <- code_freq[as.character(codes)]
  max_freq <- max(current_freq)
  unique(names(current_freq[current_freq == max_freq]))
})

# 转换为目标数据框
final_mydat <- stack(result_list) %>%
  rename(final_code = values, name = ind) %>%
  select(name, final_code) %>%
  mutate(final_code = as.integer(final_code))

# 查看结果
final_mydat

内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:01:02