在R中按ID将分类变量替换为众数,无众数时替换为最大值
解决方案
使用dplyr包实现
先将字符型的V1转换为数值型,再按ID分组计算目标值:
# 加载dplyr包 library(dplyr) # 示例数据 my_data <- data.frame(ID = c("2", "2", "2", "2" ,"4", "4", "4", "4"), V1 = c("2", "1", "2", "1", "3", "1", "4", "3")) # 处理逻辑 my_data <- my_data %>% mutate(V1 = as.numeric(V1)) %>% # 转换为数值型,确保最大值计算准确 group_by(ID) %>% mutate(V2 = { # 统计当前组内V1各值的出现频率 freq_table <- table(V1) # 找到最高频率值 max_frequency <- max(freq_table) # 筛选出所有达到最高频率的V1值 candidate_values <- as.numeric(names(freq_table[freq_table == max_frequency])) # 从候选值中取最大值 max(candidate_values) }) %>% ungroup() # 查看结果 print(my_data)
使用Base R实现
如果不想加载额外包,用ave()函数也能完成:
# 示例数据 my_data <- data.frame(ID = c("2", "2", "2", "2" ,"4", "4", "4", "4"), V1 = c("2", "1", "2", "1", "3", "1", "4", "3")) # 转换V1为数值型 my_data$V1 <- as.numeric(my_data$V1) # 按ID分组计算V2 my_data$V2 <- ave(my_data$V1, my_data$ID, FUN = function(x) { freq_table <- table(x) max_frequency <- max(freq_table) candidate_values <- as.numeric(names(freq_table[freq_table == max_frequency])) max(candidate_values) }) # 查看结果 print(my_data)
结果说明
运行上述代码后,得到的结果符合预期:
- ID为"2"的组中,V1的1和2出现频率均为2,取最大值2作为V2;
- ID为"4"的组中,V1的3出现频率最高(2次),取3作为V2。
内容的提问来源于stack exchange,提问作者19056530
相关产品推荐
相关产品推荐

