r - 了解向量子集替换如何在 R 中工作
问题描述
我想了解我正在测试的这段 R 代码中发生了什么。我想用另一个向量替换向量的一部分。和值在 data.frame 中original
。replacement
我想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
以下是我的问题:
- Line-3 上的作业是如何工作的?LHS 表达式是一个 2 项向量,而 RHS 是一个 5 元素向量。
- 为什么第 6 行的作业会发出警告(但仍然有效)?
解决方案
第一个问题
R 遍历 in 中的每个元素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
vecA[vecA %in% vecB$orig]
在 RHS 上,您将在等于TRUE
的地方重新分配,vecB$repl
这将替换2 3
为vecA
。22 33
第二个问题
在这种情况下,相同的逻辑适用于子集,但运行vecA[vecA %in% vecD$orig]
会给你
[1] 5
as7
中不存在vecA
。您正在尝试用长度为 2 的向量替换长度为 1 的向量,这是触发警告的原因。在这种情况下,它只会替换vecD$repl
恰好是的第一个元素55
。
推荐阅读
- amazon-web-services - 如何增加 EC2 实例中的主机名?
- node.js - 使用 NodeJS 在 Outlook 中创建日历事件
- python - 不同数据类型的Django admin list_display与null
- python - Pygame 将元素按顺序绘制到屏幕上
- azure-active-directory - Azure HDI 群集删除重新创建问题?
- tinymce - PHP旋转后TinyMCE显示具有错误宽度和高度的图像
- python - 如何实现将字符串解析为元组的函数?
- c# - 在哪里为测试和实时配置 HttpClient
- mysql - 为什么没有在 MySQL 中锁定 READ COMMITTED
- plot - mpf.plot - 连接两点的延长线