R:gsub,模式=向量,替换=向量

R:gsub,模式=向量,替换=向量,r,R,正如标题所述,我试图使用gsub,其中我使用一个向量来表示“模式”和“替换”。目前,我有一个如下代码: names(x1) <- gsub("2110027599", "Inv1", names(x1)) #x1 is a data frame names(x1) <- gsub("2110025622", "Inv2", names(x1)) names(x1) <- gsub("2110028045", "Inv3", names(x1)) names(x1

正如标题所述,我试图使用gsub,其中我使用一个向量来表示“模式”和“替换”。目前,我有一个如下代码:

  names(x1) <- gsub("2110027599", "Inv1", names(x1)) #x1 is a data frame
  names(x1) <- gsub("2110025622", "Inv2", names(x1))
  names(x1) <- gsub("2110028045", "Inv3", names(x1))
  names(x1) <- gsub("2110034716", "Inv4", names(x1))
  names(x1) <- gsub("2110069349", "Inv5", names(x1))
  names(x1) <- gsub("2110023264", "Inv6", names(x1))
  a <- c("2110027599","2110025622","2110028045","2110034716", "2110069349", "2110023264")
  b <- c("Inv1","Inv2","Inv3","Inv4","Inv5","Inv6")
  names(x1) <- gsub(a,b,names(x1))
X1 <- paste0("A2", a, sequence(length(a)))
X1
# [1] "A221100275991" "A221100256222" "A221100280453" 
# [4] "A221100347164" "A221100693495" "A221100232646"
我希望得到的是:

> names(x1)
  [1] "Inv6A.Ms.Amp"        "Inv6A.Ms.Vol"        "Inv6A.Ms.Watt"       "Inv6A1.Ms.Amp"       "Inv6A2.Ms.Amp"      
  [6] "Inv6A3.Ms.Amp"       "Inv6A4.Ms.Amp"       "Inv6A5.Ms.Amp"       "Inv6B.Ms.Amp"        "Inv6B.Ms.Vol"       
 [11] "Inv6B.Ms.Watt"       "Inv6B1.Ms.Amp"       "Inv6Error"           "Inv6E-Total"         "Inv6GridMs.Hz"      
 [16] "Inv6GridMs.PhV.phsA" "Inv6GridMs.PhV.phsB" "Inv6GridMs.PhV.phsC" "Inv6GridMs.TotPFPrc" "Inv6Inv.TmpLimStt"  
 [21] "Inv6InvCtl.Stt"      "Inv6Mode"            "Inv6Mt.TotOpTmh"     "Inv6Mt.TotTmh"       "Inv6Op.EvtCntUsr"   
 [26] "Inv6Op.EvtNo"        "Inv6Op.GriSwStt"     "Inv6Op.TmsRmg"       "Inv6Pac"             "Inv6PlntCtl.Stt"    
 [31] "Inv6Serial Number"   "Inv2A.Ms.Amp"        "Inv2A.Ms.Vol"        "Inv2A.Ms.Watt"       "Inv2A1.Ms.Amp"      
 [36] "Inv2A2.Ms.Amp"       "Inv2A3.Ms.Amp"       "Inv2A4.Ms.Amp"       "Inv2A5.Ms.Amp"       "Inv2B.Ms.Amp"       
 [41] "Inv2B.Ms.Vol"        "Inv2B.Ms.Watt"       "Inv2B1.Ms.Amp"       "Inv2Error"           "Inv2E-Total"        
 [46] "Inv2GridMs.Hz"       "Inv2GridMs.PhV.phsA" "Inv2GridMs.PhV.phsB" 
新答案 如果我们可以做出另一个假设,那么下面的假设应该是可行的。这一次的假设是,您确实有兴趣替换
names(x1)
中每个值的前10个字符

在这里,我将
名称(x1)
存储为名为“x1”的字符向量。该解决方案基本上使用
substr
将X1中的值分成两部分,
match
找出正确的替换选项,
paste
将所有内容重新组合在一起

a <- c("2110027599", "2110025622", "2110028045",
       "2110034716", "2110069349", "2110023264")
b <- c("Inv1","Inv2","Inv3","Inv4","Inv5","Inv6")

X1pre <- substr(X1, 1, 10)
X1post <- substr(X1, 11, max(nchar(X1)))

paste0(b[match(X1pre, a)], X1post)
#  [1] "Inv6A.Ms.Amp"        "Inv6A.Ms.Vol"        "Inv6A.Ms.Watt"      
#  [4] "Inv6A1.Ms.Amp"       "Inv6A2.Ms.Amp"       "Inv6A3.Ms.Amp"      
#  [7] "Inv6A4.Ms.Amp"       "Inv6A5.Ms.Amp"       "Inv6B.Ms.Amp"       
# [10] "Inv6B.Ms.Vol"        "Inv6B.Ms.Watt"       "Inv6B1.Ms.Amp"      
# [13] "Inv6Error"           "Inv6E-Total"         "Inv6GridMs.Hz"      
# [16] "Inv6GridMs.PhV.phsA" "Inv6GridMs.PhV.phsB" "Inv6GridMs.PhV.phsC"
# [19] "Inv6GridMs.TotPFPrc" "Inv6Inv.TmpLimStt"   "Inv6InvCtl.Stt"     
# [22] "Inv6Mode"            "Inv6Mt.TotOpTmh"     "Inv6Mt.TotTmh"      
# [25] "Inv6Op.EvtCntUsr"    "Inv6Op.EvtNo"        "Inv6Op.GriSwStt"    
# [28] "Inv6Op.TmsRmg"       "Inv6Pac"             "Inv6PlntCtl.Stt"    
# [31] "Inv6Serial Number"   "Inv2A.Ms.Amp"        "Inv2A.Ms.Vol"       
# [34] "Inv2A.Ms.Watt"       "Inv2A1.Ms.Amp"       "Inv2A2.Ms.Amp"      
# [37] "Inv2A3.Ms.Amp"       "Inv2A4.Ms.Amp"       "Inv2A5.Ms.Amp"      
# [40] "Inv2B.Ms.Amp"        "Inv2B.Ms.Vol"        "Inv2B.Ms.Watt"      
# [43] "Inv2B1.Ms.Amp"       "Inv2Error"           "Inv2E-Total"        
# [46] "Inv2GridMs.Hz"       "Inv2GridMs.PhV.phsA" "Inv2GridMs.PhV.phsB"
这是我们的
模式
替换
向量:

a <- c("2110027599", "2110025622", "2110028045", 
       "2110034716", "2110069349", "2110023264")
b <- c("Inv1","Inv2","Inv3","Inv4","Inv5","Inv6")

不知何故,
name已经有很多解决方案了,这里还有一个:

qdap包:

library(qdap)
names(x1) <- mgsub(a,b,names(x1))
库(qdap)

名称(x1)尝试
mapply

names(x1) <- mapply(gsub, a, b, names(x1), USE.NAMES = FALSE)

strungr
str\u replace\u all
文档中,“如果要对同一字符串应用多个模式和替换,请将命名版本传递给模式。”

因此,使用上面的a、b和名称(x1)

stringr::str_replace_all(names(x1), setNames(b, a))
编辑

stringr::str\u replace\u all
调用
stringi::stri\u replace\u all\u regex
,可以直接使用,而且速度更快

x <- names(x1)
pattern <- a
replace <- b

microbenchmark::microbenchmark(
  str  = stringr::str_replace_all(x, setNames(replace, pattern)),
  stri = stringi::stri_replace_all_regex(x, pattern, replace, vectorize_all = FALSE)
  )

Unit: microseconds
 expr    min      lq     mean  median   uq    max neval cld
  str 1022.1 1070.45 1286.547 1175.55 1309 2526.8   100   b
 stri  145.2  150.45  190.124  160.55  178  457.9   100  a 

x我需要做一些类似的事情,但必须使用基数R。只要向量的长度相同,我想这就行了

for (i in seq_along(a)){
  names(x1) <- gsub(a[i], b[i], names(x1))
} 
用于(沿(a)的序号i){

名字(x1)你能举一些例子说明名字(x1)
是什么样子的吗?请把名字(x1)
的输出添加到问题中……我已经添加了名字(x1),谢谢。我已经在上面发布了这个答案,但是这里没有必要使用
USE.NAMES=FALSE
@tylerlinker是的,你比我强。
USE.NAMES=FALSE
提供了一个小的性能优势,对于大数据集,它可以为你节省几乎与你输入额外字符所花费的时间一样多的时间。我尝试了str_replace_,全部来自stringr包,它应该按照描述的那样做。但是,它给了我一个错误:check_模式中的错误(模式,字符串,替换):字符串和模式的长度不兼容编辑:我意识到str_replace_都需要名称(x1)与a和b的长度相同,这就是它不起作用的原因。@wetfeets这不是意味着
str\u replace
解决方案是错误的吗?我想是的,但不确定,因为还没有人提出这个问题。我认为
mapply
也不起作用,因为它不会递归地将gsub应用于名称(x1)由于模式是在x1的名称中找到的,match返回NA值。grep1实际上不起作用,因为它用数字替换名称的整个部分,而不是部分(如编辑中所示)mapply实际上不起作用,因为gsub仍然不能处理向量,但是qdap包工作得完美无缺。因此,我选择这一点作为公认的答案。请注意:
qdap
有大量的依赖项。从我编写它以来,我就非常清楚。其次,不需要您的警告。它是开源的,并且详细说明了这些信息显然在文档的第一页。这就像说“没有必要说明这个答案中使用的库,因为你总是可以用谷歌搜索函数”。当然,警告可能没有必要,但不做进一步研究就知道还是不错。
str\u replace\u all
与原始海报的
gsub
相当。但在某些情况下,
str\u replace
可能是首选。
names(x1) <- mapply(gsub, a, b, names(x1), USE.NAMES = FALSE)
library(stringr)
names(x1) <- str_replace(names(x1), a, b)
stringr::str_replace_all(names(x1), setNames(b, a))
x <- names(x1)
pattern <- a
replace <- b

microbenchmark::microbenchmark(
  str  = stringr::str_replace_all(x, setNames(replace, pattern)),
  stri = stringi::stri_replace_all_regex(x, pattern, replace, vectorize_all = FALSE)
  )

Unit: microseconds
 expr    min      lq     mean  median   uq    max neval cld
  str 1022.1 1070.45 1286.547 1175.55 1309 2526.8   100   b
 stri  145.2  150.45  190.124  160.55  178  457.9   100  a 
for (i in seq_along(a)){
  names(x1) <- gsub(a[i], b[i], names(x1))
}