0Pricing
R Academy · 课时

命名向量与命名序列

为向量赋予名称并访问这些名称,编写易读代码

命名向量与命名序列 是 CoddyKit 上的免费 R Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。

命名向量简介

命名向量是为每个元素关联一个名称(字符标签)的向量。名称可以让代码更易读,并允许您按名称而不是位置索引访问元素。

# A plain vector vs a named vector
plain <- c(78, 92, 85, 67)
named <- c(Alice = 78, Bob = 92, Carol = 85, Dave = 67)

cat('Plain vector:', plain, '
')
cat('Named vector:
')
print(named)

使用 c() 创建命名向量

创建命名向量最简单的方法是在 c() 中使用 name = value 对。名称可以是任何有效字符串;如果名称包含空格或特殊字符,请将其放在反引号或引号中。

# GDP in trillions USD
gdp <- c(USA = 27.4, China = 18.0, Germany = 4.1,
         Japan = 4.2, UK = 3.1)
cat('GDP values:
')
print(gdp)
cat('Names:', names(gdp), '
')
cat('Values:', unname(gdp), '
')

names() 函数

names(x) 会以字符向量的形式获取向量的名称。您也可以在创建向量后使用 names(x) <- c(...) 赋予名称,这会直接修改该向量。

# Assign names after creation
temps <- c(22.1, 18.5, 25.3, 20.0)
cat('Before naming:', temps, '
')

names(temps) <- c('Mon', 'Tue', 'Wed', 'Thu')
cat('After naming:
')
print(temps)

# Retrieve names
cat('Days:', names(temps), '
')

按名称访问元素

使用 x["name"] 或 x[["name"]] 访问命名向量中的元素。单括号 [] 返回保留名称的子集;双括号 [[]] 只返回值本身,不包含名称。

scores <- c(Math = 88, Science = 92, English = 75, History = 81)

# Single bracket: keeps name
cat('Math score (with name):
')
print(scores['Math'])

# Double bracket: just the value
cat('Science score (value only):', scores[['Science']], '
')

# Multiple names
cat('STEM subjects:
')
print(scores[c('Math', 'Science')])

使用 setNames() 实现函数式风格

setNames(x, nm) 会返回一个将名称设置为 nm 的 x 副本,而不会修改原向量。这在管道中很有用,因为您可以将命名操作作为一系列操作的一部分。

# setNames returns a named copy (does not modify original)
raw_values <- c(0.85, 0.72, 0.91, 0.68)
metrics <- setNames(raw_values, c('Precision', 'Recall', 'F1', 'Accuracy'))

cat('Original (unchanged):', raw_values, '
')
cat('Named metrics:
')
print(metrics)

# Best metric
best_name <- names(which.max(metrics))
cat('Best metric:', best_name, '=', metrics[best_name], '
')

修改名称

您可以通过索引 names(x) 来更改单个名称。当您需要重命名一部分元素而不重新创建整个向量时,这种方式很有用。

prices <- c(apple = 1.20, bannana = 0.80, cherry = 3.50)  # typo!

# Fix a single name
names(prices)[2] <- 'banana'
cat('Fixed names:
')
print(prices)

# Rename all
names(prices) <- c('Apple', 'Banana', 'Cherry')  # capitalise
cat('Capitalised:
')
print(prices)

使用 seq() 和 names() 创建命名序列

您可以将 seq() 与 setNames() 结合起来创建命名序列。这对于按月或按周建立索引尤其有用,因为名称可以为数值添加上下文。

# Monthly average temperature with names
temps_monthly <- setNames(
  c(3.1, 4.2, 8.5, 13.0, 17.2, 21.0, 23.5, 23.0, 19.0, 13.5, 7.8, 4.0),
  month.abb
)
cat('Monthly temps:
')
print(temps_monthly)
cat('Summer avg:', mean(temps_monthly[c('Jun', 'Jul', 'Aug')]), '
')

筛选命名向量

命名向量同时支持逻辑索引和字符索引。您可以按名称选择元素,同时按值筛选元素,因此命名向量非常适合用作小型查找表。

population <- c(Tokyo = 37.4, Delhi = 32.9, Shanghai = 28.5,
                Dhaka = 22.5, Cairo = 21.3, Mumbai = 20.7)

# Select cities with population > 25 million
big_cities <- population[population > 25]
cat('Cities over 25M:
')
print(big_cities)

# Sort descending by population
cat('Ranked:
')
print(sort(population, decreasing = TRUE))

使用 unname() 移除名称

unname(x) 会移除向量中的所有名称,只返回值本身。当您要将数据传递给不接受命名向量的函数,或名称会让输出显得杂乱时,这非常有用。

named_vec <- c(x1 = 10, x2 = 20, x3 = 30, x4 = 40)
cat('Named:
')
print(named_vec)

unnamed_vec <- unname(named_vec)
cat('Unnamed:
')
print(unnamed_vec)

# Check
cat('Has names after unname:', !is.null(names(unnamed_vec)), '
')

将命名向量用作查找表

命名向量最强大的用途之一是充当查找表:将键映射到值。您可以使用命名向量并对其进行索引,而不是编写一连串的 if-else 语句。

# Map month abbreviation to number of days
days_in_month <- c(Jan=31, Feb=28, Mar=31, Apr=30, May=31,
                   Jun=30, Jul=31, Aug=31, Sep=30, Oct=31,
                   Nov=30, Dec=31)

# Look up specific months
query <- c('Mar', 'Jul', 'Nov')
cat('Days in', query[1], ':', days_in_month[query[1]], '
')
cat('Days in', query[2], ':', days_in_month[query[2]], '
')
cat('Days in', query[3], ':', days_in_month[query[3]], '
')

命名向量:要点

R 中命名向量功能的总结:

  • 使用 c(name = value, ...) 创建,或通过 names(x) <- c(...) 赋予名称
  • 使用 x['name'] 按名称访问(保留名称),或使用 x[['name']] 访问(仅返回值)
  • setNames(x, nm) 返回命名副本,而不会修改原向量
  • unname(x) 移除所有名称
  • 命名向量可以作为简洁优雅的查找表(替代一连串的 if-else)
# Complete workflow
rates <- c(USD = 1.0, EUR = 0.92, GBP = 0.79, JPY = 149.5)

# Convert 100 USD to each currency
amount_usd <- 100
converted <- amount_usd * rates
cat('100 USD in other currencies:
')
print(round(converted, 2))

快速检查

当 x 是命名向量时,x['key'] 和 x[['key']] 有什么区别?

回顾:命名向量

做得很好!本课的要点如下:

  • 命名向量将每个元素与一个字符标签配对
  • 使用 c(name = val) 语法创建,或使用 names(x) <- ... 赋予名称
  • x['name'] 返回保留名称的子集;x[['name']] 只返回值
  • setNames() 是以函数式方式(不修改原向量)附加名称
  • 使用命名向量作为查找表,替代冗长的 if-else 语句链
  • 需要原始值时,使用 unname() 移除名称
# Named vector as grade lookup
grade_map <- c('90'='A', '80'='B', '70'='C', '60'='D')
student_score <- 80

# Find grade bracket
brackets <- c(90, 80, 70, 60)
threshold <- max(brackets[brackets <= student_score])
cat('Score:', student_score, '-> Grade:', grade_map[as.character(threshold)], '
')

常见问题解答

「命名向量与命名序列」课时是免费的吗?

是的 — 「命名向量与命名序列」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。

「命名向量与命名序列」这节课中我会学到什么?

为向量赋予名称并访问这些名称,编写易读代码 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 R Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「命名向量与命名序列」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 R Academy 课中编写并运行代码吗?

能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 用于整数范围的冒号运算符
  2. 使用 seq() 创建自定义序列
  3. 使用 rep() 重复值
  4. 命名向量与命名序列
← 返回 R Academy