添加和排序
本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 45 课,共 64 课。
赋值给新的列名会添加该列。列之间的算术运算会按行进行,就像向量算术一样:
orders <- data.frame(item = c("tea", "jam", "oil"), qty = c(2, 5, 1), price = c(4, 2.5, 9))
orders$total <- orders$qty * orders$price
print(orders)输出:
item qty price total
1 tea 2 4.0 8.0
2 jam 5 2.5 12.5
3 oil 1 9.0 9.0df[order(df$col), ]按列对行进行排序。左侧的行号仍与原来的行对应。要按从高到低排序,可以使用减号或 decreasing = TRUE;遇到相同值时,可以使用第二个键:
orders <- data.frame(item = c("tea", "jam", "oil"), qty = c(2, 5, 1), price = c(4, 2.5, 9))
orders$total <- orders$qty * orders$price
print(orders[order(-orders$total, orders$item), c("item", "total")])输出:
item total
2 jam 12.5
3 oil 9.0
1 tea 8.0新列可以是由其他列构成的文本。sprintf() 可以一次处理整列:
orders <- data.frame(item = c("tea", "jam"), qty = c(2, 5), price = c(4, 2.5))
orders$label <- sprintf("%d x %s", orders$qty, orders$item)
print(orders$label)输出:
[1] "2 x tea" "5 x jam"rbind() 会从一个列相同的单行数据框中添加一行,而 head(df, n) 会保留前 n 行:
orders <- data.frame(item = c("tea", "jam"), qty = c(2, 5))
orders <- rbind(orders, data.frame(item = "oil", qty = 1))
print(nrow(orders))
print(head(orders[order(-orders$qty), ], 2))输出:
[1] 3
item qty
2 jam 5
1 tea 2挑战
简单完成 order_totals(df)。df 包含 item、qty 和 price 列。添加一个 total 列(数量乘以价格),按 total 从高到低对各行排序(total 相同的项目按字母顺序排列),并为每行返回一行 jam: 12.50,total 保留两位小数。
提供的代码使用 read.csv(text = input) 从输入中读取表格:第一行包含列名,之后的每一行都是一行数据,各值之间用逗号分隔。代码会打印返回的每一行。
亲手试试
order_totals <- function(df) {
# 在这里编写你的代码
character(0)
}
# 已提供的输入和输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
df <- read.csv(text = input)
cat(order_totals(df), sep = "\n")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: R 在线编译器