如何在R中按行获取特定列最频繁分类值及解决pmax错误
解决每行访问类型的众数及次数统计问题
你之前用pmax的思路不对哦,pmax是按字符的字典序(或者数值大小)取每行的最大值,完全不是统计出现次数最多的类别,难怪会出错!咱们换个思路,直接逐行统计每个访问类型的出现频率,再提取众数和对应的次数。
方案1:处理包含多值的单元格(比如"SFU,GFU"这种逗号分隔的情况)
如果你的单元格里有多个访问类型用逗号分隔,咱们先拆分这些值,再统计每个独立类型的出现次数:
library(tidyverse) # 先模拟你的数据结构(你可以替换成自己的out1) out1 <- tibble( Date = c("2023-01-01", "2023-01-02", "2023-01-03"), Col2 = c("GFU", "SFU", "SFU"), Col3 = c("GFU", "GFU", "SFU"), Col4 = c("SFU", "SFU", "SFU"), Col5 = c("GFU,SFU", "SFU", "SFU,GFU") ) # 定义逐行处理的函数:返回出现次数最多的类型和次数 get_most_frequent <- function(row_data) { # 提取2-5列的内容,拆分逗号分隔的多值,转成无空格的向量 all_values <- str_split(row_data[2:5], ",") %>% unlist() %>% trimws() # 统计每个值的出现频率 freq_stats <- table(all_values) # 找出最大频率值 max_count <- max(freq_stats) # 找出对应的类型(如果有多个并列,这里取第一个,可按需修改) top_type <- names(freq_stats)[freq_stats == max_count][1] # 返回结果 return(tibble(MAX1 = top_type, Repeat_Count = max_count)) } # 应用到每一行,合并结果 out1 <- out1 %>% rowwise() %>% bind_cols(get_most_frequent(c_across(everything()))) %>% ungroup() # 查看结果 print(out1)
运行后,第三行的MAX1会是SFU,Repeat_Count是4,完全符合你的需求——因为拆分后SFU在前三个单元格各出现1次,第四个单元格里也有1次,总共4次。
方案2:不拆分单元格(把每个单元格内容当作单一类别)
如果你的"SFU,GFU"是一个独立的类别,不需要拆分,那修改函数即可:
get_most_frequent_no_split <- function(row_data) { # 直接提取2-5列的内容,去除空格 all_values <- row_data[2:5] %>% unlist() %>% trimws() freq_stats <- table(all_values) max_count <- max(freq_stats) top_type <- names(freq_stats)[freq_stats == max_count][1] return(tibble(MAX1 = top_type, Repeat_Count = max_count)) } # 应用函数 out1 <- out1 %>% rowwise() %>% bind_cols(get_most_frequent_no_split(c_across(everything()))) %>% ungroup()
这种情况下第三行的Repeat_Count会是3,因为SFU在三个单元格里出现,SFU,GFU是单独的类别只出现1次。
额外说明:处理并列众数
如果某一行有多个类别出现次数相同(比如SFU和GFU都出现2次),你可以修改函数返回所有并列的类别,比如把top_type的代码改成:
top_type <- paste(names(freq_stats)[freq_stats == max_count], collapse = ", ")
这样就会返回类似SFU, GFU的结果。
内容的提问来源于stack exchange,提问作者user12106572
相关产品推荐
相关产品推荐

