标签: stringr

当可能的输出已知时加速`strsplit`

我有一个带有因子列的大型数据框,我需要通过用分隔符分割因子名称来划分为三个因子列.这是我目前的方法,这是一个非常慢的大数据框架(有时数百万行):

data <- readRDS("data.rds")
data.df <- reshape2:::melt.array(data)
head(data.df)
##  Time Location    Class Replicate Population
##1    1        1 LIDE.1.S         1 0.03859605
##2    2        1 LIDE.1.S         1 0.03852957
##3    3        1 LIDE.1.S         1 0.03846853
##4    4        1 LIDE.1.S         1 0.03841260
##5    5        1 LIDE.1.S         1 0.03836147
##6    6        1 LIDE.1.S         1 0.03831485

Rprof("str.out")
cl <- which(names(data.df)=="Class")
Classes <- do.call(rbind, strsplit(as.character(data.df$Class), "\\."))
colnames(Classes) <- c("Species", "SizeClass", "Infected")
data.df <- cbind(data.df[,1:(cl-1)],Classes,data.df[(cl+1):(ncol(data.df))])
Rprof(NULL)

head(data.df)
##  Time Location Species SizeClass Infected Replicate Population
##1    1        1 …
Run Code Online (Sandbox Code Playgroud)

performance r strsplit stringr reshape2

6
推荐指数
1
解决办法
840
查看次数

str_replace(包stringr)不能替换r中的括号?

我说有一根绳子

 fruit <- "()goodapple"
Run Code Online (Sandbox Code Playgroud)

我想删除字符串中的括号.我决定使用stringr包,因为它通常可以处理这类问题.我用 :

str_replace(fruit,"()","")
Run Code Online (Sandbox Code Playgroud)

但没有任何东西被替换,以下内容被替换:

[1] "()good"
Run Code Online (Sandbox Code Playgroud)

如果我只想更换右半支架,它可以工作:

str_replace(fruit,")","") 
[1] "(good"
Run Code Online (Sandbox Code Playgroud)

但是,左半支架不起作用:

str_replace(fruit,"(","")
Run Code Online (Sandbox Code Playgroud)

并显示以下错误:

Error in sub("(", "", "()good", fixed = FALSE, ignore.case = FALSE, perl = FALSE) : 
 invalid regular expression '(', reason 'Missing ')''
Run Code Online (Sandbox Code Playgroud)

任何人都有想法为什么会这样?如何删除字符串中的"()"呢?

r stringr

6
推荐指数
1
解决办法
1万
查看次数

按顺序替换匹配具有不同替换的字符串中的单个模式的多个位置

使用stringr包,很容易以矢量化方式执行正则表达式替换.

问题:如何执行以下操作:

替换中的每个单词

hello,world??your,make|[]world,hello,pos
Run Code Online (Sandbox Code Playgroud)

不同的替代品,例如增加数量

1,2??3,4|[]5,6,7
Run Code Online (Sandbox Code Playgroud)

注意,不能假设简单的分隔符,实际用例更复杂.


stringr::str_replace_all 似乎没有用,因为它

str_replace_all(x, "(\\w+)", 1:7)
Run Code Online (Sandbox Code Playgroud)

为应用于所有单词的每个替换生成一个向量,或者它具有不确定和/或重复的输入条目,以便

str_replace_all(x, c("hello" = "1", "world" = "2", ...))
Run Code Online (Sandbox Code Playgroud)

不会为此目的而工作.

regex r stringr stringi

6
推荐指数
1
解决办法
331
查看次数

使用R识别字符串中连续出现的特定字母段

我想确定下面数据框中的字符串列是否在字符串的前20个字符内至少重复5次字母"V"或"G".

样本数据:

 data = data.frame(class = c('a','b','C'), string =
 c("ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ",
 "AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD",
 "GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER"))
Run Code Online (Sandbox Code Playgroud)

例如,第一行中的字符串在前20个字符位置内具有"VVVVG".类似地,第三行中的字符串具有"VVGGV".

data
#  class                                                  string
#1     a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ
#2     b      AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD
#3     C       GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER
Run Code Online (Sandbox Code Playgroud)

所需的输出应如下所示:

#   class                                                  string result
# 1     a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ   TRUE
# 2     b      AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD  FALSE
# 3     C       GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER   TRUE
Run Code Online (Sandbox Code Playgroud)

r substr stringr

6
推荐指数
1
解决办法
195
查看次数

用R中的字符串删除前导0

我有以下数据

id
00001
00010
00022
07432
Run Code Online (Sandbox Code Playgroud)

我想删除前导0s,因此数据需要以下内容

id
1
10
22
7432
Run Code Online (Sandbox Code Playgroud)

r stringr

6
推荐指数
3
解决办法
2353
查看次数

在模式发生后拆分字符串

我有以下字符串向量.它包含两个元素.每个元素由两个折叠短语组成.

strings <- c("This is a phrase with a NameThis is another phrase",
         "This is a phrase with the number 2019This is another phrase")
Run Code Online (Sandbox Code Playgroud)

我想将这些短语拆分为向量中的每个元素.我一直在尝试这样的事情:

library(stringr)

str_split(strings, "\\B(?=[a-z|0-9][A-Z])")
Run Code Online (Sandbox Code Playgroud)

几乎给了我正在寻找的东西:

[[1]]
[1] "This is a phrase with a Nam" "eThis is another phrase"

[[2]]
[1] "This is a phrase with the number 201" "9This is another phrase"
Run Code Online (Sandbox Code Playgroud)

我想在模式之后进行拆分,但无法弄清楚如何做到这一点.

我想我接近一个解决方案,并希望得到任何帮助.

regex r stringr

6
推荐指数
1
解决办法
81
查看次数

更改R中已过滤的data.frame中的一列中的所有值

我有一个非常混乱的数据框架,其中一列的值可以理解为人类而不是计算机,有点像下面的那样.

df<-data.frame("id"=c(1:10), 
           "colour"=c("re d", ", red", "re-d","green", "gre, en", ", gre-en",  "blu e", "green", ", blue", "bl ue"))
Run Code Online (Sandbox Code Playgroud)

我可以过滤掉df str_detect

df %>% filter(str_detect(tolower(colour), pattern = "gr")) 
Run Code Online (Sandbox Code Playgroud)

但我想将所有过滤后的结果重命名为相同的值,以便我可以纠缠它.
有什么建议?
我试图用模式分开,但没有成功.

编辑:不是全部.在我正在使用的df中不需要空格.让我们说在制作df中写绿色的正确方法是"gr.een".

编辑2:
想要的结果与伪造的颜色拼写只是为了得到一个想法:

id     colour
1      r. ed
2      r. ed
3      r. ed
4      gr. een
6      gr. een
7      gr. een
8      blu. e
9      gr. een           
10     blu. e
Run Code Online (Sandbox Code Playgroud)

r stringr dplyr

6
推荐指数
1
解决办法
189
查看次数

使用单独的方法仅考虑 R 中的第一个点来拆分列

这是我的数据框:

df <- tibble(col1 = c("1. word","2. word","3. word","4. word","5. N. word","6. word","7. word","8. word"))
Run Code Online (Sandbox Code Playgroud)

我需要使用单独的函数分成两列,并将它们重命名为Numbers和 其他称为Words. 我已经这样做了,但它不起作用:

df %>% separate(col = col1 , into = c('Number','Words'), sep = "^. ")
Run Code Online (Sandbox Code Playgroud)

问题是第五个有 2 个点。我不知道如何处理有关正则表达式的问题。

有什么帮助吗?

r stringr tidyr

5
推荐指数
1
解决办法
491
查看次数

在 dplyr 中使用 R 中的 str_detect 和 case_when

这是我的 df:

mydf <- structure(list(Action = c("Passes accurate", "Passes accurate", 
"Passes accurate", "Passes accurate", "Lost balls", "Lost balls (in opp. half)", 
"Passes (inaccurate)", "Interceptions (in opp. half)", "Interceptions", 
"Positional attacks")), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))
Run Code Online (Sandbox Code Playgroud)

我有这个向量:passes <- c('Passes','passes','Assists','Crosses')

我正在尝试这样做:mydf %>% mutate(newcol = case_when(str_detect(Action, passes) ~ 'passes'))

但我只有第一行充满了passes. 例如,我应该将前 4 行填充为passes. 还有第七排。我怎样才能用case_when函数来实现这一点?

r stringr dplyr

5
推荐指数
1
解决办法
1548
查看次数

删除其他两个字符之间的所有字符(保留其他字符)

我知道这个问题已经以不同的方式被问过多次,但我找不到一个解决方案,可以在保留边框的同时替换一些“边框”之间的文本。

input <- "this is my 'example'"
change <- "test"
Run Code Online (Sandbox Code Playgroud)

现在我想用 中的值替换单引号之间的所有内容change

预期输出为"this is my 'test'

我尝试了不同的变体:

stringr::str_replace(input, "['].*", change)
Run Code Online (Sandbox Code Playgroud)

但这不起作用。例如上面给出的是"this is my test",所以它不再有单引号。

有任何想法吗?

regex r stringr

5
推荐指数
1
解决办法
157
查看次数

标签 统计

r ×10

stringr ×10

regex ×3

dplyr ×2

performance ×1

reshape2 ×1

stringi ×1

strsplit ×1

substr ×1

tidyr ×1