R语言:实现识别并统计向量重复元素的自定义函数
解决R函数统计向量重复元素及出现次数的问题
你的现有代码存在几个问题:
- 双重循环是在找向量中所有两两相等的元素对,会把同一个重复元素多次记录(比如元素出现3次的话,这里会匹配2次),而且第二列的
n只是匹配到的次数,不是元素实际出现的总次数 - 预先把矩阵行数固定为10,太死板,向量里重复元素多了会不够用,少了又会多出一堆NA行
下面给你两种可行的解决方案:
方法一:用R内置函数高效实现(推荐)
R自带专门的频数统计工具,不用自己写复杂循环,代码简洁还不容易出错:
Repetidos <- function(V) { # 统计每个元素的出现次数 freq_table <- table(V) # 筛选出出现次数≥2的元素(也就是重复过的元素) repeated_items <- freq_table[freq_table >= 2] # 转换成矩阵并设置列名 result_matrix <- cbind(元素 = names(repeated_items), 出现次数 = as.numeric(repeated_items)) # 若元素是数值型,把矩阵转成数值格式(避免第一列是字符) result_matrix <- apply(result_matrix, 2, as.numeric) return(result_matrix) } # 测试示例 V <- c(1, 1, 2, 2, 3, 3, 4, 5, 5) Repetidos(V)
运行结果:
元素 出现次数 [1,] 1 2 [2,] 2 2 [3,] 3 2 [4,] 5 2
方法二:优化你的循环写法
如果想基于自己的循环思路修改,可以先完成全局计数,再筛选重复元素:
Repetidos <- function(V) { # 用列表存每个元素的出现次数 count_dict <- list() # 遍历向量统计次数 for (elem in V) { elem_key <- as.character(elem) if (elem_key %in% names(count_dict)) { count_dict[[elem_key]] <- count_dict[[elem_key]] + 1 } else { count_dict[[elem_key]] <- 1 } } # 筛选出出现次数≥2的元素 repeated_elems <- names(count_dict)[sapply(count_dict, function(x) x >= 2)] repeated_counts <- unlist(count_dict[repeated_elems]) # 构建结果矩阵 result_matrix <- cbind(元素 = repeated_elems, 出现次数 = repeated_counts) # 转数值格式(按需) result_matrix <- apply(result_matrix, 2, as.numeric) return(result_matrix) } # 测试示例 V <- c(1, 1, 2, 2, 3, 3, 4, 5, 5) Repetidos(V)
运行结果和方法一完全一致。
内容的提问来源于stack exchange,提问作者Gaspar
相关产品推荐
相关产品推荐

