在R中筛选以1开头的数值并处理小数部分求和
解决R语言数据处理需求的步骤
1. 构造原始数据集
先复现你提供的数据集:
df <- data.frame( col1 = c(148210.1, 854213.5, 232323.2), col2 = c(448521.3, 125896.5, 454586.3), col3 = c(955635.9, 487951.2, NA), col4 = c(585212.1, 121545.6, NA), col5 = c(558542.3, 125894.6, NA), col6 = c(125312.6, 154215.9, NA) )
2. 生成目标单列数据框New_DF
提取所有非NA值,筛选以数字1开头的数值,再转为单列数据框:
# 将数据框转为一维向量并过滤NA值 all_values <- na.omit(as.vector(t(df))) # 筛选以"1"开头的数值(转为字符串匹配正则) filtered_values <- all_values[grepl("^1", as.character(all_values))] # 转为单列数据框 New_DF <- data.frame(Col1 = filtered_values)
运行后New_DF的输出与预期一致:
Col1 1 148210.1 2 125312.6 3 125896.5 4 121545.6 5 125894.6 6 154215.9
3. 提取小数部分并求和(排除小数为9的数值)
提供两种可靠方法:
方法一:数值计算法(处理浮点数精度)
# 提取小数部分(取模1) decimal_parts <- filtered_values %% 1 # 四舍五入到1位小数,避免浮点数精度误差(如154215.9的小数部分可能显示为0.8999999) rounded_decimals <- round(decimal_parts, 1) # 排除小数部分为0.9的数值,再将小数转为整数后求和 sum_result <- sum(rounded_decimals[rounded_decimals != 0.9] * 10) sum_result # 输出结果:24
方法二:字符串分割法(直观无精度问题)
# 将数值转为字符串,按小数点分割 str_split <- strsplit(as.character(filtered_values), "\\.") # 提取小数点后的部分并转为整数 decimal_nums <- sapply(str_split, function(x) as.integer(x[2])) # 排除小数部分为9的数值,直接求和 sum_result <- sum(decimal_nums[decimal_nums != 9]) sum_result # 输出结果:24
内容的提问来源于stack exchange,提问作者FranciscoL
相关产品推荐
相关产品推荐

