r - 如何根据向量元素在列表中的位置替换它们?
问题描述
早上好 !
假设我们有以下内容:
set.seed(1)
x <- sample(c(1,2,3,4,5,6,7,8,9),size=15,replace=TRUE)
x
library(dplyr)
x=case_when(x %in% 1:3 ~ 1, x %in% 6:8 ~ 2, x %in% c(4, 5, 9) ~ 3)
print("after")
x
输出 :
3 4 6 9 2 9 9 6 6 1 2 2 7 4 7
[1] "after"
1 3 2 3 1 3 3 2 2 1 1 1 2 3 2
此代码将{6,7,8}
向量 x 中的一组值替换为一个特定值,例如2
.
我想要做的是将向量1:3
, 6:8
,存储c(4, 5, 9)
在一个列表中list_1
以获得相同的输出。list_1
如果列表的长度和替换规则发生变化,我正在寻找一个可以轻松工作的解决方案。请注意,替换规则的数量通常等于列表list_1
长度。
我希望我的问题很清楚!提前感谢您的帮助!
解决方案
也许你可以试试下面的代码
with(stack(setNames(list_1,c(1,2,3))),as.numeric(ind[match(x,values)]))
例子
> x
[1] 9 4 7 1 2 7 2 3 1 5 5 6 7 9 5
> with(stack(setNames(list_1,c(1,2,3))),as.numeric(ind[match(x,values)]))
[1] 3 3 2 1 1 2 1 1 1 3 3 2 2 3 3
另一种选择是使用矩阵乘法
> c(t(c(1,2,3)) %*% do.call(rbind,Map(function(v) x%in% v,list_1)))
[1] 3 3 2 1 1 2 1 1 1 3 3 2 2 3 3
推荐阅读
- xml - 运行与数据转换相关的Java代码时出现xsl代码问题
- json - XSD 中的所有限制在 Avro 中都可用吗?
- c++ - 如何查找导致结果不一致的代码
- python - 基于标签的共现图像聚类
- c# - ASP.NET Core 3.0 端点路由不适用于默认路由
- gradle - 在 packageRunBuild Segmentation Fault 上 Gradle 构建失败
- python - C++ python模块(基于Pybind11)导入报错:ModuleNotFoundError
- javascript - 如何正确创建班级成员?
- c# - 如何在 .netcore-3.0 中测试标头属性?
- php - 为什么边缘不缓存图像