列和行
本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 43 课,共 64 课。
df$col 和 df[["col"]] 会将列作为普通向量返回,因此所有向量函数都适用于它。[[ ]] 接受存储在变量中的列名:
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
print(people$age)
print(mean(people$age))
col <- "city"
print(people[[col]])输出:
[1] 36 22 41
[1] 33
[1] "london" "paris" "rome" 方括号接受 [row, column],和矩阵一样。留空的一侧会选中所有内容,也可以按名称选择列:
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
print(people[2, ])
print(people[, c("name", "city")])输出:
name age city
2 bo 22 paris
name city
1 ada london
2 bo paris
3 cy rome单元格用 df[row, column] 表示,给它赋值会改变该值。给整列赋值的方式也一样:
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
print(people[3, "age"])
people[3, "age"] <- 42
people$city <- toupper(people$city)
print(people)输出:
[1] 41
name age city
1 ada 36 LONDON
2 bo 22 PARIS
3 cy 42 ROME要逐行遍历数据,可以对 seq_len(nrow(df)) 进行循环,并使用 df[i, "col"] 或 df$col[i] 读取每个单元格:
people <- data.frame(
name = c("ada", "bo", "cy"),
age = c(36, 22, 41),
city = c("london", "paris", "rome")
)
for (i in seq_len(nrow(people))) {
cat(people$name[i], "lives in", people[i, "city"], "\n")
}输出:
ada lives in london
bo lives in paris
cy lives in rome 挑战
简单完成 person_card(df, i)。针对第 i 行 name: bo,按列的顺序,每列返回一行,其中包含列名和该行中的值。
提供的代码使用 read.csv(text = input) 从输入中读取表:第一行包含列名,后续每一行都是一行数据,值之间用逗号分隔。输入的最后一行包含 i,代码会打印每个返回的行。
亲手试试
person_card <- function(df, i) {
# 在这里编写你的代码
character(0)
}
# 已提供的输入和输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
df <- read.csv(text = input[-length(input)])
i <- as.numeric(input[length(input)])
cat(person_card(df, i), sep = "\n")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: R 在线编译器