r - 匹配字符值并更改 R 中不同列中的相应值
问题描述
我正在尝试将字符向量values[1:73]
与数据框中的列进行匹配,以更改同一数据框中完全不同的列 (1,258 x 74)。
假设,向量是
[1] "AA1" "BB1"
[3] "AA2" "BB2"
数据框是
Instrument Holder
<chr> <chr>
1 CB AA1
2 CH BB2
3 CH XX
4 CB YY
5 CH BB2
现在我需要匹配向量df$Holder
并将 CH 更改为 CBdf$Instrument
如果匹配。
我已经尝试过match()
一些过滤,但最终得到了错误的输出。
indx <- match(vector, df$Holder)
indx <- indx[!is.na(indx)]
for (i in seq_along(indx)) {
df$Instument[indx[i]] <- c("CB")
}
和
for (i in seq_along(vector)){
new <- df %>%
filter(Holder == vector[i]) %>%
mutate(Instrument = "CB")
}
期待你的想法!
谢谢
解决方案
不太确定,但我认为这就是你想要的:
数据
vector <- c("AA1", "BB1", "AA2", "BB2")
library(dplyr)
df <- tribble(
~Instrument, ~Holder,
"CB", "AA1",
"CH", "BB2",
"CH", "XX",
"CB", "YY",
"CH", "BB2"
)
'匹配'
df_new <- df %>%
mutate(test = stringi::stri_detect_regex(
df$Holder,
paste0(vector, collapse = "|")
)) %>%
mutate(Instrument = ifelse(test,
"CB",
Instrument))
df_new
#> # A tibble: 5 x 3
#> Instrument Holder test
#> <chr> <chr> <lgl>
#> 1 CB AA1 TRUE
#> 2 CB BB2 TRUE
#> 3 CH XX FALSE
#> 4 CB YY FALSE
#> 5 CB BB2 TRUE
为了您的利益,我创建了一个名为 test 的新专栏,以便更容易看到正在发生的事情。只要test
是TRUE
,列 Instrument 就会改变,否则保持不变。paste0(vector, collapse = "|")
从向量中的不同模式生成单个正则表达式。如果在字符串中找到模式,则基本上与返回stringi::stri_detect_regex
相同。(但如果你不想在这里使用与 相同。)grepl
TRUE
stringi
grepl
mutate(test = grepl(paste0(vector, collapse = "|"), df$Holder))
推荐阅读
- python - 如何读取和请求其中包含 HTML 编码的特殊字符的 XPath(Python、lxml、HTML)
- ios - UISwipeGestureRecognizer 可以用于 UIHostingController 中的视图吗?
- c++ - 使用多个文件对函数的未定义引用
- assembly - 如何使绘图程序在 200x320 像素(而不是 200x255)组件上工作?
- reactjs - react-hook-form isDirty 对我来说似乎很奇怪
- sql-server - 聚类索引新基数算子灾难性估计
- c++ - 使用 bash 连接到 unix-socket
- image - Flutter 图像保存在 iOS 中变得模糊
- javascript - 与 Chorme 相比,为什么在 Firefox 上运行地理定位时会给出更准确的结果
- angularjs - 简单的 AngularJS 路由示例不起作用