首页 > 解决方案 > 匹配字符值并更改 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")
}

期待你的想法!

谢谢

标签: rdplyr

解决方案


不太确定,但我认为这就是你想要的:

数据

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 的新专栏,以便更容易看到正在发生的事情。只要testTRUE,列 Instrument 就会改变,否则保持不变。paste0(vector, collapse = "|")从向量中的不同模式生成单个正则表达式。如果在字符串中找到模式,则基本上与返回stringi::stri_detect_regex相同。(但如果你不想在这里使用与 相同。)greplTRUEstringigrepl mutate(test = grepl(paste0(vector, collapse = "|"), df$Holder))


推荐阅读