Menu
CoddyTech

列和行

本课属于 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 
challenge icon

挑战

简单

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

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

逻辑与流程中的所有课

自己练习: R 在线编译器