R 在多个模式匹配后替换数据表列中的多个值

R 在多个模式匹配后替换数据表列中的多个值,r,string,design-patterns,replace,data.table,dplyr,R,String,Design Patterns,Replace,Data.table,Dplyr,这里有一个片段可以帮助像我这样的一些“R初学者”: 我引用此线程是为了满足我的数据表上的需求: 我正在寻找一种简单的方法,用部分匹配字符串替换数据表中某列中的整个字符串。我在论坛上找不到合适的人选,因此发表了这篇文章 dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c(&quo

这里有一个片段可以帮助像我这样的一些“R初学者”: 我引用此线程是为了满足我的数据表上的需求:

我正在寻找一种简单的方法,用部分匹配字符串替换数据表中某列中的整个字符串。我在论坛上找不到合适的人选,因此发表了这篇文章

dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c("P_1","QQ_2","RR_3")
> dt
      x    y    z
1:  A_1  K_1  P_1
2: BB_2 LL_2 QQ_2
3: CC_3 MM_3 RR_3

在列中使用
as.matrix()
可排除输入
str\u replace\u all()函数时的警告。
结果是:

> dt[,2]<-str_replace_all(as.matrix(dt[,2]),c("K_.*" = "FORMULA","LL_.*" = "RACE","MM_.*" = "CAR"))
> dt
      x       y    z
1:  A_1 FORMULA  P_1
2: BB_2    RACE QQ_2
3: CC_3     CAR RR_3
>

我在Rstudio的控制台上看到的错误是:

Error in `:=`(one_more, ifelse(grepl("A_.*", value), "HONDA", "FERRARI")) : 
  Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").
在R终端上运行良好

> dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c("P_$
> dt[, nu_col := c(1:3)]
> molten.dt<-melt(dt,id.vars = "nu_col", measure.vars = c("x","y","z"))
> molten.dt
   nu_col variable value
1:      1        x   A_1
2:      2        x  BB_2
3:      3        x  CC_3
4:      1        y   K_1
5:      2        y  LL_2
6:      3        y  MM_3
7:      1        z   P_1
8:      2        z  QQ_2
9:      3        z  RR_3
> molten.dt[, one_more := ifelse(grepl("A_.*", value), "HONDA","FERRARI")]
> molten.dt
   nu_col variable value one_more
1:      1        x   A_1    HONDA
2:      2        x  BB_2  FERRARI
3:      3        x  CC_3  FERRARI
4:      1        y   K_1  FERRARI
5:      2        y  LL_2  FERRARI
6:      3        y  MM_3  FERRARI
7:      1        z   P_1  FERRARI
8:      2        z  QQ_2  FERRARI
9:      3        z  RR_3  FERRARI
>
>dt有一个不同的API用于就地更新。这将是:

tib%突变(新列=旧列+2)
使用
:=
操作符也可以执行相同的操作:

dt[,新列:=旧列+2]
请注意,一旦进入括号,我们就可以将向量传递给其他函数。要将其应用到您的示例中,我们可以

库(data.table)
图书馆(stringr)

早上好!。谢谢,我总是喜欢将函数用于data.table的
j
参数。您的回答消除了关于单列用法与向量用法以及非常流行的
:=
用法的混淆。我在字符向量和
:=
j
的使用方面遇到了一些其他问题。以下是我在RStuido的控制台中以RScript运行foll.code时遇到的问题:我编辑了我的原始帖子,如果这篇帖子有点吵,我道歉。我唯一想的是你已经加载了
重塑2
。因此,您实际上调用的不是
data.table::melt()
。当我显式调用
reformae2::melt()``时,我能够重现错误。注意,编辑更多的是一个新问题。是的,我认为这是一个新的问题。我想用建议的试验来结束这篇文章。。在脚本中没有明确显示,但在RStudio环境中,加载了
重塑
。在R终端环境中,这难道不会被“看到”吗?简单地说,在这个环境中,我同时加载了data.table和reforme2,并且我假设通过Rstudio访问Rterminal和console时,它们具有相同的环境。我可能错了,再多说一次。。我通读了
melt()
文档,并假设在R终端和控制台中,
melt()
的工作方式相同。
Error in `:=`(one_more, ifelse(grepl("A_.*", value), "HONDA", "FERRARI")) : 
  Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").
> dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c("P_$
> dt[, nu_col := c(1:3)]
> molten.dt<-melt(dt,id.vars = "nu_col", measure.vars = c("x","y","z"))
> molten.dt
   nu_col variable value
1:      1        x   A_1
2:      2        x  BB_2
3:      3        x  CC_3
4:      1        y   K_1
5:      2        y  LL_2
6:      3        y  MM_3
7:      1        z   P_1
8:      2        z  QQ_2
9:      3        z  RR_3
> molten.dt[, one_more := ifelse(grepl("A_.*", value), "HONDA","FERRARI")]
> molten.dt
   nu_col variable value one_more
1:      1        x   A_1    HONDA
2:      2        x  BB_2  FERRARI
3:      3        x  CC_3  FERRARI
4:      1        y   K_1  FERRARI
5:      2        y  LL_2  FERRARI
6:      3        y  MM_3  FERRARI
7:      1        z   P_1  FERRARI
8:      2        z  QQ_2  FERRARI
9:      3        z  RR_3  FERRARI
>