我想了解一下我正在测试的这段R代码中发生了什么。我想用另一个向量替换向量的一部分。 original
和replacement
值在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
这是我的问题:
答案 0 :(得分:2)
第一个问题
R遍历vecA
中的每个元素,并检查其是否存在于vecB$orig
中。 %in%
运算符将返回一个布尔值。如果运行命令vecA %in% vecB$orig
,则会得到以下信息:
[1] FALSE TRUE TRUE FALSE FALSE
告诉您在向量1 2 3 4 5
中看到2
和3
在vecB$orig
中。
通过此命令子集vecA
,您仅隔离了TRUE
中的vecA
值,因此vecA[vecA %in% vecB$orig]
返回:
[1] 2 3
在RHS上,您要重新分配vecA[vecA %in% vecB$orig]
等于TRUE
到vecB$repl
的位置,这将用{{1}替换2 3
中的vecA
}。
第二个问题
在这种情况下,相同的逻辑适用于子集,但是运行22 33
会给您
vecA[vecA %in% vecD$orig]
因为[1] 5
在7
中不存在。您正在尝试将长度为1的向量替换为长度为2的向量,这将触发警告。在这种情况下,它将仅替换vecA
的第一个元素vecD$repl
。