如何在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
相关产品推荐
相关产品推荐

