了解向量子集替换在 R 中的工作原理
Understand how vector subset replacement works in R
我想了解我正在测试的这段 R 代码中发生了什么。我想用另一个向量替换一个向量的一部分。 original
和 replacement
值在 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
这是我的问题:
- 3 号线的作业如何进行? LHS 表达式是一个 2 项向量,而 RHS 是一个 5 元素向量。
- 为什么第 6 行的作业给出警告(但仍然有效)?
第一个问题
R 遍历 vecA
中的每个元素并检查它是否存在于 vecB$orig
中。 %in%
运算符将 return 一个布尔值。如果你 运行 命令 vecA %in% vecB$orig
你会得到以下结果:
[1] FALSE TRUE TRUE FALSE FALSE
告诉您在向量 1 2 3 4 5
中,它在 vecB$orig
中看到 2
和 3
。
通过此命令对 vecA
进行子集化,您将仅隔离 vecA
中的 TRUE
值,因此 vecA[vecA %in% vecB$orig]
returns:
[1] 2 3
在 RHS 上,只要 vecA[vecA %in% vecB$orig]
等于 TRUE
到 vecB$repl
,您就是 re-assigning,这将替换 vecA
中的 2 3
为22 33
.
第二题
在这种情况下,相同的逻辑适用于子集化,但是 运行ning vecA[vecA %in% vecD$orig]
给你
[1] 5
因为 7
在 vecA
中不存在。您正在尝试用长度为 2 的向量替换长度为 1 的向量,这会触发警告。在这种情况下,它只会替换 vecD$repl
的第一个元素,恰好是 55
.
我想了解我正在测试的这段 R 代码中发生了什么。我想用另一个向量替换一个向量的一部分。 original
和 replacement
值在 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
这是我的问题:
- 3 号线的作业如何进行? LHS 表达式是一个 2 项向量,而 RHS 是一个 5 元素向量。
- 为什么第 6 行的作业给出警告(但仍然有效)?
第一个问题
R 遍历 vecA
中的每个元素并检查它是否存在于 vecB$orig
中。 %in%
运算符将 return 一个布尔值。如果你 运行 命令 vecA %in% vecB$orig
你会得到以下结果:
[1] FALSE TRUE TRUE FALSE FALSE
告诉您在向量 1 2 3 4 5
中,它在 vecB$orig
中看到 2
和 3
。
通过此命令对 vecA
进行子集化,您将仅隔离 vecA
中的 TRUE
值,因此 vecA[vecA %in% vecB$orig]
returns:
[1] 2 3
在 RHS 上,只要 vecA[vecA %in% vecB$orig]
等于 TRUE
到 vecB$repl
,您就是 re-assigning,这将替换 vecA
中的 2 3
为22 33
.
第二题
在这种情况下,相同的逻辑适用于子集化,但是 运行ning vecA[vecA %in% vecD$orig]
给你
[1] 5
因为 7
在 vecA
中不存在。您正在尝试用长度为 2 的向量替换长度为 1 的向量,这会触发警告。在这种情况下,它只会替换 vecD$repl
的第一个元素,恰好是 55
.