Menu
CoddyTech

添加和排序

本课属于 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.0

df[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
challenge icon

挑战

简单

完成 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")
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: R 在线编译器