R 数据框:按标签分组并防止字段类型误读
构建任务数据框,按标签累计分钟数并排序,理解列类型、分组结果和字符标签的表示方式。
本节目标
构建任务数据框,按标签累计分钟数并排序,理解列类型、分组结果和字符标签的表示方式。
环境与运行方法
准备 R 4.x,保存为 lesson.R,执行 Rscript lesson.R。只使用基础 R,不安装 tidyverse。示例用 cat 固定输出格式,便于直接核对结果。
核心思路
数据框把等长列组织成记录。标签应作为字符列,分钟数作为数值列,分组前先确认字段类型。aggregate 可以按标签对数值求和,结果再显式排序。
完整示例
tasks <- data.frame(
tag=c("r", "stats", "r"),
minutes=c(20, 35, 10),
stringsAsFactors=FALSE
)
totals <- aggregate(minutes ~ tag, data=tasks, FUN=sum)
totals <- totals[order(totals$tag), ]
for (i in seq_len(nrow(totals))) {
cat(totals$tag[i], "=", totals$minutes[i], "\n", sep="")
}
cat("original=", nrow(tasks), "\n", sep="")预期输出
r=30
stats=35
original=3逐步理解
公式 minutes~tag 表达按 tag 分组计算 minutes,FUN=sum 选择累计。排序后依次输出,原数据框仍有三条记录,没有被分组结果替换。
seq_len 在行数为零时给出空索引,避免 1:n 在 n 为零时产生意外序列。来自文件的数值列可能读成字符或因子,不能不检查就强制转数字,尤其因子转换可能得到内部编码。
常见问题与边界
- 1:n 在 n=0 时并不表示空循环。
- 分组前应明确缺失值处理规则。
- 因子转数值需要理解标签与内部编码的差别。
动手练习
追加标签 r、分钟数 5,再查看分组和原始行数。
参考答案
r 变为 35,stats 仍为 35,原始行数为 4。分组结果行数表示标签数量,不是原始记录数量。
文章回复
0 条公开回复