Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R变异&;gsub,其中模式基于列_R_Dplyr_Gsub_Mutate_Rowwise - Fatal编程技术网

R变异&;gsub,其中模式基于列

R变异&;gsub,其中模式基于列,r,dplyr,gsub,mutate,rowwise,R,Dplyr,Gsub,Mutate,Rowwise,我正在尝试使用mutate()和gsub()从var\u 1中删除pattern 由于gsub()。否则,它将只使用模式列中的第一条记录 我想知道是否有其他方法可以在不使用rowwise()的情况下实现相同的结果,因为它会大大降低过程的速度 test <- data.frame( var_1 = c('1AB', '2AB', '3C') ,pattern = c('AB','A','C') ) test %>% dplyr::rowwise() %>% dp

我正在尝试使用
mutate()
gsub()
var\u 1
中删除
pattern

由于
gsub()。否则,它将只使用
模式
列中的第一条记录

我想知道是否有其他方法可以在不使用
rowwise()
的情况下实现相同的结果,因为它会大大降低过程的速度

test <- data.frame(
  var_1 = c('1AB', '2AB', '3C')
  ,pattern = c('AB','A','C')
)

test %>%
  dplyr::rowwise() %>%
  dplyr::mutate( result = sub(pattern, '', var_1)
          )
test%
dplyr::行方式()%>%
dplyr::mutate(结果=sub(模式“”,变量1)
)
预期结果:

# A tibble: 3 x 4
# Rowwise: 
  var_1 var_2 pattern result
  <chr> <lgl> <chr>   <chr> 
1 1AB   FALSE AB      1     
2 2AB   TRUE  A       2B    
3 3C    FALSE C       3 
#一个tible:3 x 4
#顺时针:
变量1变量2模式结果
1 AB假AB 1
2真正的A 2B
3C假c3

您可以使用矢量化的
stringr
选项

使用
str\u remove

library(dplyr)
library(stringr)

test %>% mutate(result = str_remove(var_1, pattern))

#  var_1 pattern result
#1   1AB      AB      1
#2   2AB       A     2B
#3    3C       C      3
这与使用替换为“
str\u replace
相同


我们可以使用
map2

library(dplyr)
library(purrr)
test %>% 
      mutate(result = map2_chr(var_1, pattern, ~ sub(.y, '', .x)))

谢谢Ronak!我试着比较mutate+str_替换和with+str_替换,似乎mutate+str_替换要慢得多。你知道为什么会这样吗(请参阅我下一篇评论中的代码)?microbenchmark::microbenchmark(test%>%mutate(temp=stringr::str_remove(string=var_1,pattern=pattern)),with(test,stringr::str_remove(string=var_1,pattern=pattern)),times=10L)我实际上不知道
mutate
是否会增加额外的开销。您正在测试多少行数据?我使用的是上面定义的相同数据帧,因此有3行数据,而
mutate
方法所需时间至少是
with
方法的10倍。如果使用3行数据,则无法获得任何有意义的结果。将数据扩展到至少10k行,然后进行测试。
library(dplyr)
library(purrr)
test %>% 
      mutate(result = map2_chr(var_1, pattern, ~ sub(.y, '', .x)))