如何在R中编写ST函数,按指定城市计算数据框的均值与标准差
完成ST函数编写的解决方案
你的数据框df3如下:
| City | Income | Cost | Age |
|---|---|---|---|
| NY | 1237 | 2432 | 43 |
| NY | 6352 | 8632 | 32 |
| Boston | 6487 | 2846 | 54 |
| NJ | 6547 | 7353 | 42 |
| Boston | 7564 | 7252 | 21 |
| NY | 9363 | 7563 | 35 |
| Boston | 3262 | 7352 | 54 |
| NY | 9473 | 8667 | 76 |
| NJ | 6234 | 4857 | 31 |
| Boston | 5242 | 7684 | 39 |
| NJ | 7483 | 4748 | 47 |
| NY | 9273 | 6573 | 53 |
原代码存在几个核心问题:
- 函数参数名混乱(定义用
c,判断用s) - 重复加载
dplyr包(只需在函数外加载一次) summarise_at语法错误,保留小数不能直接传第二个参数- 数据合并逻辑错误,且
dataframe拼写错误(应为data.frame) - 城市存在性判断逻辑错误(向量比较不能直接用
==)
以下是修正后的完整代码:
library(dplyr) library(tidyr) # 用于数据格式转换 ST <- function(city_name) { # 检查输入城市是否存在于数据框中 if (!(city_name %in% df3$City)) { return(NA) } # 筛选目标城市数据,转格式后计算均值和标准差 result <- df3 %>% filter(City == city_name) %>% select(Income, Cost, Age) %>% pivot_longer(cols = everything(), names_to = "variable", values_to = "value") %>% group_by(variable) %>% summarise( Mean = round(mean(value, na.rm = TRUE), 2), SD = round(sd(value, na.rm = TRUE), 2) ) %>% ungroup() return(result) } # 调用示例 ST("NJ")
调用ST("NJ")会返回如下结果:
| variable | Mean | SD |
|---|---|---|
| Income | 6754.67 | 624.33 |
| Cost | 5652.67 | 1462.03 |
| Age | 40.00 | 8.08 |
代码说明
- 先校验输入城市的合法性,不存在则返回
NA - 用
filter筛选指定城市的数据,避免全表分组计算 - 通过
pivot_longer将宽格式转为长格式,方便按变量分组统计 - 用
round强制将均值、标准差保留两位小数 - 返回结构符合要求的三列表格
内容的提问来源于stack exchange,提问作者user11607046
相关产品推荐
相关产品推荐

