R语言如何提取嵌套列表各分组中出现频率最高的前3个值
R语言分组提取高频账户号实现方案
以下是可直接运行的完整代码,完全匹配你的需求:
IBAN_top3 <- list() y <- " 0000000000" # 保留原始分组名称(nr1/nr2/nr3) names(IBAN_top3) <- names(dat) for (i in seq_along(dat)) { # 解包嵌套列表+过滤无效账号 tmp <- unlist(dat[[i]]) tmp <- tmp[!tmp %in% y] # 统计频次并按降序排序 freq_table <- sort(table(tmp), decreasing = TRUE) # 取前3位,长度不足3时自动返回全部有效值,无报错风险 IBAN_top3[[i]] <- head(freq_table, n = 3) }
核心逻辑说明
- 用
seq_along(dat)替代1:length(dat),避免分组为空时出现边界报错,兼容性更强 sort(table(tmp), decreasing = TRUE)直接按频次从高到低排序,同频次项按字符串默认规则排序,符合你“同频次任选”的要求head(freq_table, n = 3)是适配不足3个有效值的核心:R的head函数在输入向量长度小于参数n时,会自动返回全部元素,不会抛出下标越界错误
如果你只需要提取Top3的账号值,不需要保留频次,可额外加一步处理:
# 仅提取账号值,输出为每个分组对应账号的字符向量 IBAN_top3_values <- lapply(IBAN_top3, names)
运行结果示例
对应你提供的测试数据,最终输出如下:
> IBAN_top3 $nr1 tmp NL11BANKO0111111111 NL11BANKO0111111113 NL11BANKO0111111112 9 3 2 $nr2 tmp NL74INGB0111111111 NL30ABNA0111111111 NL31RABO0111111111 8 7 3 $nr3 tmp NL11BANKO0111111111 NL11BANKO0111111113 10 3
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

