编写R函数:统计除含Text列外各列中整数值的出现频率
解决方案:统计数据框中指定列的纯整数值出现频率
实现思路
- 筛选出**列名不含"Text"**的所有列;
- 统一处理所有列,识别真正的纯整数值(排除NA、带格式的字符串如"21%"、非数字字符);
- 汇总所有符合条件的整数值的出现频率并排序。
函数代码
count_integer_frequencies <- function(df) { df %>% # 排除列名包含"Text"的列 select(-contains("Text")) %>% # 转换为长格式,便于统一处理所有列的值 pivot_longer(cols = everything(), names_to = "column", values_to = "value") %>% # 移除NA值 drop_na(value) %>% # 判断是否为纯整数值: # - 数值类型:检查是否等于其整数形式(排除小数) # - 字符类型:用正则匹配纯数字(含正负),且转数值不失败(排除"21%"这类非纯数字) mutate(is_integer = case_when( is.numeric(value) ~ value == as.integer(value), is.character(value) ~ str_detect(value, "^-?\\d+$") & !is.na(as.numeric(value)) )) %>% # 只保留纯整数值 filter(is_integer) %>% # 转换为整数类型 mutate(value = as.integer(value)) %>% # 统计每个整数的出现频率 count(value, name = "frequency") %>% # 按频率降序排列 arrange(desc(frequency)) }
测试示例数据
使用你提供的示例数据进行测试:
library(tidyverse) df <- tibble(Region = c("AU","USA",65,"USA","!UK",88,"USA","CA","!UK"), lock = c(26,18,NA,1,"Test",15,NA,"21%",13), type= c("sale",NA,NA,"target","target",NA,"sale",NA,"target"), state_Text=c("TX","CA","NY","OT","DE","WN","WA","PH","NJ")) # 调用函数 count_integer_frequencies(df)
输出结果解释
运行后会得到如下结果(每个纯整数各出现1次):
# A tibble: 7 × 2 value frequency <int> <int> 1 1 1 2 13 1 3 15 1 4 18 1 5 26 1 6 65 1 7 88 1
关键细节说明
- 列筛选:
select(-contains("Text"))会自动排除所有列名中包含"Text"的列,无需手动指定; - 纯整数判断:兼顾数值型和字符型的情况,确保像
65(数值)和"88"(字符纯数字)都能被识别,而"21%"、"Test"这类会被排除; - NA处理:用
drop_na提前移除NA值,避免后续判断出错。
内容的提问来源于stack exchange,提问作者potro
相关产品推荐
相关产品推荐

