了解向量子集替换如何在R中工作

时间:2019-07-19 18:17:24

标签: r variable-assignment

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

这是一个简单的例子:

> 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行上的分配给出警告(但仍然有效)?

1 个答案:

答案 0 :(得分:2)

第一个问题

R遍历vecA中的每个元素,并检查其是否存在于vecB$orig中。 %in%运算符将返回一个布尔值。如果运行命令vecA %in% vecB$orig,则会得到以下信息:

[1] FALSE  TRUE  TRUE FALSE FALSE

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

通过此命令子集vecA,您仅隔离了TRUE中的vecA值,因此vecA[vecA %in% vecB$orig]返回:

[1] 2 3

在RHS上,您要重新分配vecA[vecA %in% vecB$orig]等于TRUEvecB$repl的位置,这将用{{1}替换2 3中的vecA }。

第二个问题

在这种情况下,相同的逻辑适用于子集,但是运行22 33会给您

vecA[vecA %in% vecD$orig]

因为[1] 5 7中不存在。您正在尝试将长度为1的向量替换为长度为2的向量,这将触发警告。在这种情况下,它将仅替换vecA的第一个元素vecD$repl