【发布时间】:2021-03-05 06:09:40
【问题描述】:
这是一个可以帮助像我这样的一些“R初学者”的sn-p: 我指的是这个线程需要我的 melted 数据表:
Replace entire string anywhere in dataframe based on partial match with dplyr
我正在寻找一种简单的方法,用部分匹配字符串替换数据表中的一个列中的整个字符串。我在论坛上找不到合适的人选,因此发了这篇文章。
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
用多个模式替换 col y 中的多个值以匹配:
dt[,2]<-str_replace_all(as.matrix(dt[,2]),c("K_.*" = "FORMULA","LL_.*" = "RACE","MM_.*" = "CAR"))
在列上使用as.matrix() 会排除str_replace_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
>
非常不优雅,但对我有用,当列数据很大时,这似乎是一个快速的解决方案。
需要library(stringr)。
感谢您提出任何改进建议。
在我尝试以下方法时编辑这篇文章:
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[, nu_col := c(1:3)]
molten.dt<-melt(dt,id.vars = "nu_col", measure.vars = c("x","y","z"))
molten.dt[, one_more := ifelse(grepl("A_.*", value), "HONDA","FERRARI")]
我在 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
>
【问题讨论】:
标签: r string design-patterns replace data.table