了解向量子集替换在 R 中的工作原理

Understand how vector subset replacement works in R

我想了解我正在测试的这段 R 代码中发生了什么。我想用另一个向量替换一个向量的一部分。 originalreplacement 值在 data.frame 中。我想用相应的 replacement 值替换向量中与 original 列匹配的所有元素。我有更大问题的答案,但我无法理解它是如何工作的。

这是一个简单的例子:

> vecA <- 1:5;
> vecB <- data.frame(orig=c(2,3), repl=c(22,33));
> vecA[vecA %in% vecB$orig] <- vecB$repl #Question-1
> vecA
[1]  1 22 33  4  5

> vecD<-data.frame(orig=c(5,7), repl=c(55,77))
> vecA[vecA %in% vecD$orig] <- vecD$repl #Question-2
Warning message:
In vecA[vecA %in% vecD$orig] <- vecD$repl :
  number of items to replace is not a multiple of replacement length
> vecA
[1]  1 22 33  4 55

这是我的问题:

  1. 3 号线的作业如何进行? LHS 表达式是一个 2 项向量,而 RHS 是一个 5 元素向量。
  2. 为什么第 6 行的作业给出警告(但仍然有效)?

第一个问题

R 遍历 vecA 中的每个元素并检查它是否存在于 vecB$orig 中。 %in% 运算符将 return 一个布尔值。如果你 运行 命令 vecA %in% vecB$orig 你会得到以下结果:

[1] FALSE  TRUE  TRUE FALSE FALSE

告诉您在向量 1 2 3 4 5 中,它在 vecB$orig 中看到 23

通过此命令对 vecA 进行子集化,您将仅隔离 vecA 中的 TRUE 值,因此 vecA[vecA %in% vecB$orig] returns:

[1] 2 3

在 RHS 上,只要 vecA[vecA %in% vecB$orig] 等于 TRUEvecB$repl,您就是 re-assigning,这将替换 vecA 中的 2 322 33.

第二题

在这种情况下,相同的逻辑适用于子集化,但是 运行ning vecA[vecA %in% vecD$orig] 给你

[1] 5

因为 7vecA 中不存在。您正在尝试用长度为 2 的向量替换长度为 1 的向量,这会触发警告。在这种情况下,它只会替换 vecD$repl 的第一个元素,恰好是 55.