为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

侃侃尔雅 2019-11-29 10:31:36

如标题所述,我尝试使用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))

我猜想某个地方有一个Apply函数可以做到这一点,但我不确定要使用哪个函数!

查看完整描述

3 回答

?
大话西游666

已经有很多解决方案,这里还有更多解决方案:


qdap软件包:


library(qdap)

names(x1) <- mgsub(a,b,names(x1))


查看完整回答
反对 2019-11-29
?
慕姐8265434

从的严谨文档中str_replace_all,“如果要对同一字符串应用多个模式和替换,请将命名版本传递给模式。”


因此,从上面使用a,b和names(x1)


library(stringr)

names(b) <- a

str_replace_all(names(x1), b)


查看完整回答
反对 2019-11-29
?
慕慕森

新答案

如果我们可以做出另一个假设,则以下方法应该起作用。这次的假设是,您真的有兴趣从中的每个值替换前10个字符names(x1)。


在这里,我names(x1)将其存储为名为“ X1”的字符向量。该解决方案实质上是将substrX1中的值分成两部分,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"

旧答案

如果我们可以假定它names(x1)与模式和替换的顺序相同,并且基本上是一对一的替换,那么您也许可以摆脱just sapply。


这是这种情况的一个例子:


想象一下“ names(x)”看起来像这样:


X1 <- paste0("A2", a, sequence(length(a)))

X1

# [1] "A221100275991" "A221100256222" "A221100280453" 

# [4] "A221100347164" "A221100693495" "A221100232646"

这是我们的pattern和replacement向量:


a <- c("2110027599", "2110025622", "2110028045", 

       "2110034716", "2110069349", "2110023264")

b <- c("Inv1","Inv2","Inv3","Inv4","Inv5","Inv6")

sapply如果这些假设成立,这就是我们可能会使用的方式。


sapply(seq_along(a), function(x) gsub(a[x], b[x], X1[x]))

# [1] "A2Inv11" "A2Inv22" "A2Inv33" "A2Inv44" "A2Inv55" "A2Inv66"


查看完整回答
反对 2019-11-29
  • 3 回答
  • 0 关注
  • 173 浏览

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信