首页 > 解决方案 > 了解向量子集替换如何在 R 中工作

问题描述

我想了解我正在测试的这段 R 代码中发生了什么。我想用另一个向量替换向量的一部分。和值在 data.frame 中originalreplacement我想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. Line-3 上的作业是如何工作的?LHS 表达式是一个 2 项向量,而 RHS 是一个 5 元素向量。
  2. 为什么第 6 行的作业会发出警告(但仍然有效)?

标签: rvariable-assignment

解决方案


第一个问题

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

[1] FALSE  TRUE  TRUE FALSE FALSE

这告诉你在1 2 3 4 5它看到的向量中23vecB$orig.

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

[1] 2 3

vecA[vecA %in% vecB$orig]在 RHS 上,您将在等于TRUE的地方重新分配,vecB$repl这将替换2 3vecA22 33

第二个问题

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

[1] 5

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


推荐阅读