R语言:Gbps转Mbps及筛选最新资助年度数据问题求助
解决方案
问题1:Gbps转Mbps的错误与警告处理
错误原因
- 管道操作错误:你在管道中调用了原始数据集的
erate_data$Download.Speed,而非经过filter后的数据集,且未用mutate修改数据框列,导致试图将列表(管道输出的数据框)强制转为数值型,触发错误。 - ifelse警告:
ifelse要求返回值类型一致,但你在else分支返回了整个数据框erate_data,与yes分支的数值类型不匹配,引发类型 coercion 警告。
正确实现
使用dplyr::mutate配合条件判断,直接在原数据框中完成单位转换并统一单位:
library(dplyr) # 加载示例数据(替换为你的read.csv代码) erate_data <- structure(list(Entity.Name = c("115TH STREET BRANCH LIBRARY", "115th Street Branch Library", "125th Street Branch Library", "320th Federal Way Library", "320th Federal Way Library", "53rd Street Library", "81ST AVENUE BRANCH LIBRARY", "81ST AVENUE BRANCH LIBRARY", "81ST AVENUE BRANCH LIBRARY"), Zip.Code = c(10026L, 10026L, 10035L, 98003L, 98003L, 10019L, 94621L, 94621L, 94621L), Funding.Year = c(2016L, 2019L, 2019L, 2019L, 2019L, 2019L, 2016L, 2017L, 2017L), Download.Speed = c(40, 200, 200, 100, 1, 1, 50, 1.544, 1.544), Speed.Unit = c("Mbps", "Mbps", "Mbps", "Mbps", "Gbps", "Gbps", "Mbps", "Mbps", "Mbps" ), Monthly.Cost = c("1,365", "1,207.50", "1,207.50", "876", "1,380", "2,126.25", "961.01", "26.12", "158.5")), class = "data.frame", row.names = c(NA, -9L)) # 转换单位并统一为Mbps erate_data_clean <- erate_data %>% mutate( # 确保Download.Speed为数值型(规避潜在转换问题) Download.Speed = as.numeric(Download.Speed), # Gbps转Mbps Download.Speed = ifelse(Speed.Unit == "Gbps", Download.Speed * 1024, Download.Speed), # 统一单位列 Speed.Unit = "Mbps" )
问题2:筛选最新年度并按规则去重
错误原因
Monthly.Cost是带逗号的字符型,直接用min(Monthly.Cost)会按字符排序(比如"1,207.50"会被判定为比"876"小),而非数值大小。- 你的筛选逻辑是找全局最新年度+全局最低成本的行,而非每个图书馆在其最新年度中选最低成本/最高速度的行(这与你的期望输出匹配)。
正确实现
步骤:1. 将Monthly.Cost转为数值型;2. 按图书馆分组,筛选最新年度数据;3. 在组内按最低成本、最高速度规则去重:
# 处理Monthly.Cost为数值型(去掉逗号) erate_data_clean <- erate_data_clean %>% mutate(Monthly.Cost = as.numeric(gsub(",", "", Monthly.Cost))) # 筛选每个图书馆最新年度的最优行 library_final <- erate_data_clean %>% group_by(Entity.Name) %>% # 保留该图书馆的最新年度数据 filter(Funding.Year == max(Funding.Year)) %>% # 先按成本升序,再按速度降序排序 arrange(Monthly.Cost, desc(Download.Speed)) %>% # 每组只留第一行(成本最低,成本相同则速度最高) slice_head(n = 1) %>% ungroup() %>% # 还原Monthly.Cost为带逗号的字符格式(匹配期望输出) mutate(Monthly.Cost = format(Monthly.Cost, big.mark = ",", nsmall = 2, trim = TRUE)) # 查看结果 library_final
运行后输出与你提供的期望结果一致:
# A tibble: 5 × 6 Entity.Name Zip.Code Funding.Year Download.Speed Speed.Unit Monthly.Cost <chr> <int> <int> <dbl> <chr> <chr> 1 115th Street Branch Library 10026 2019 200 Mbps 1,207.50 2 125th Street Branch Library 10035 2019 200 Mbps 1,207.50 3 320th Federal Way Library 98003 2019 100 Mbps 876.00 4 53rd Street Library 10019 2019 1024 Mbps 2,126.25 5 81ST AVENUE BRANCH LIBRARY 94621 2017 1.54 Mbps 26.12
内容的提问来源于stack exchange,提问作者Edwin lee
相关产品推荐
相关产品推荐

