标签: stringr

使用与tidyr分开的不同长度向量

我想将一列字符串(例如[1,58,10])与tidyr分开使用.我的问题是有时候列更短(永远不会更长).我在同一数据框中有很多列有此问题.

加载包

require(tidyr)
require(dplyr)
require(stringr)
Run Code Online (Sandbox Code Playgroud)

数据

在这里,我使用来自真实数据的样本制作数据框."载体"在col1中长度为10,在col2中为9或10.有一个时间列只是为了显示还有其他列.

df <- data.frame(
        time = as.POSIXct(1:5, origin=Sys.time()),
        col1 = c("[0,355,0,0,0,1227,0,0,382059,116]", "[0,31,0,0,0,5,0,0,925,1]", "[0,1,0,0,0,471,0,0,130339,3946]", "[0,0,0,0,0,223,0,0,37666,12]", "[0,19,0,0,0,667,0,0,336956,53]"),
        col2 = c("[0,355,0,0,0,1227,0,0,382059,116]", "[0,355,0,0,0,1227,0,0,382059,116]", "[0,0,0,0,0,223,0,0,37666,12]", "[0,19,0,0,0,667,0,0,336956]","[0,355,0,0,0,1227,0,0,382059,116]")
    )
Run Code Online (Sandbox Code Playgroud)

我多么想要它

对于所有"向量"长度相等的第一列,我可以使用separate()来获得我想要的.

a1 <- df %>% 
    mutate(col1 = str_sub(col1,2,-2)) %>%
    separate(col1, paste("col1",1:10,sep="."),",")

# Making sure the numbers are numeric
a1 <- as.data.frame(sapply(a1, as.numeric)) %>%
    mutate(time = as.POSIXct(time, origin="1970-01-01")) %>% select(-col2)
Run Code Online (Sandbox Code Playgroud)

这导致了

> a1
                 time col1.1 col1.2 col1.3 col1.4 col1.5 col1.6 col1.7 col1.8
1 2014-11-07 12:21:45      0    355      0      0      0   1227      0 …
Run Code Online (Sandbox Code Playgroud)

r stringr dplyr tidyr

4
推荐指数
1
解决办法
1666
查看次数

用数字和字母拆分字符串

我有字母和数字混合的字符串.我想分开他们并从他们那里判刑.

a<-"DiabetesTestInPast12months"
b<-"SmokingMorethan12PackYears"
c<-"30MinsOrLessExercise"
Run Code Online (Sandbox Code Playgroud)

我想得到:

a<-"Diabetes test in past 12 months"
b<-"Smoking more than 12 pack years"
c<-"30 mins or less exercise"
Run Code Online (Sandbox Code Playgroud)

我无法找到一种方法来使用stringr's 提取向量内的数字str_extract_all.

string r stringr

4
推荐指数
1
解决办法
778
查看次数

R - 查找包含所有字符串/模式的所有向量元素 - str_detect grep

样本数据

files.in.path = c("a.4.0. name 2015 - NY.RDS", 
                  "b.4.0. name 2016 - CA.RDS", 
                  "c.4.0. name 2015 - PA.RDS")
strings.to.find = c("4.0", "PA")
Run Code Online (Sandbox Code Playgroud)

我想要显示包含所有元素的逻辑向量strings.to.find。结果想要:

FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)

此代码将查找包含以下任何一项的元素strings.to.find,即,使用 OR 运算符

str_detect(files.in.path, str_c(strings.to.find, collapse="|")) # OR operator
 TRUE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)

此代码尝试使用 AND 运算符但不起作用。

str_detect(files.in.path, str_c(strings.to.find, collapse="&")) # AND operator
FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

这在几行中有效,我可以编写一个for循环,该循环将为具有大量strings.to.find

det.1 = str_detect(files.in.path,      "4.0"  )   
det.2 = str_detect(files.in.path,      "PA"  )   
det.all = det.1 & det.2
 FALSE FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

但是有没有更好的方法不涉及使用依赖于strings.to.find.

r and-operator stringr grepl

4
推荐指数
2
解决办法
5716
查看次数

使用filter()和str_detect()按多个模式过滤

我想使用filter()和str_detect()匹配多个模式来过滤数据帧,而不需要多个str_detect()函数调用.在下面的示例中,我想过滤数据框df以仅显示包含字母a f和的行o.

df <- data.frame(numbers = 1:52, letters = letters)
df %>%
    filter(
        str_detect(.$letters, "a")|
        str_detect(.$letters, "f")| 
        str_detect(.$letters, "o")
    )
#  numbers letters
#1       1       a
#2       6       f
#3      15       o
#4      27       a
#5      32       f
#6      41       o
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法

df %>%
    filter(
        str_detect(.$letters, c("a", "f", "o"))
     )
#  numbers letters
#1       1       a
#2      15       o
#3      32       f
Run Code Online (Sandbox Code Playgroud)

并收到以下错误

警告消息:在stri_detect_regex中(字符串,模式,opts_regex = opts(模式)):较长的对象长度不是较短对象长度的倍数

r stringr stringi tidyverse

4
推荐指数
1
解决办法
7606
查看次数

str_replace_all by position,应用于矢量

我有一个数据框,其中每个条目都是一些字符串,用逗号分隔.我想用一种简洁的方法来按位置替换每个元素.

这是数据的玩具版本

 library(tidyverse)

d1 <- tibble(
  r1 = c("lab1",
         "lab2,lab3",
         NA,
         "lab3,lab4"),
  r2 = c(NA,
         "lab1",
         "lab2",
         "lab2,lab3")
  ) 
Run Code Online (Sandbox Code Playgroud)

所以lab我想要的每个元素都由相应的rep元素重新替换.

d1 %>% 
  modify_at(1:2,
        ~ str_replace_all(.,
                          c("lab1", "lab2", "lab3", "lab4"),
                          c("rep1", "rep2", "rep3", "rep4")))
Run Code Online (Sandbox Code Playgroud)

返回

# A tibble: 4 x 2
         r1        r2
      <chr>     <chr>
1      rep1      <NA>
2 rep2,lab3      lab1
3      <NA>      lab2
4 lab3,rep4 lab2,lab3
Run Code Online (Sandbox Code Playgroud)

所以我每个单元只进行一次替换r1,而我需要全部替换它们.

r stringr purrr tidyverse

4
推荐指数
1
解决办法
401
查看次数

grep的值= TRUE是否有一个等效的字符串?

是否有一个stringr等效grepvalue设置为TRUE?(我想避免下面NAstringr命令返回的。)

library(stringr)
x <- c("a", "b", "a")
grep("a", x, value = TRUE)  # returns "a" "a"
str_extract(x, "a")  # returns "a" NA  "a"
Run Code Online (Sandbox Code Playgroud)

r stringr

4
推荐指数
1
解决办法
249
查看次数

在R中使用stringr在最后一个子字符串之后找到剩余的字符串

如何使用str_match提取最后一个子字符串之后的剩余字符串。

例如,对于字符串“带奶油的苹果,橙子和香蕉”,我想在最后一次出现“和”之后提取该字符串的其余部分,以返回“香蕉和奶油”。

我尝试了此命令的许多替代方法,但它要么一直返回第一个“和”之后的字符串其余部分,要么返回空字符串。

library(stringr)

str_match("apples and oranges and bananas with cream", "(?<= and ).*(?! and )")

    #     [,1]                             
    #[1,] "oranges and bananas with cream"
Run Code Online (Sandbox Code Playgroud)

我已经在StackOverflow上搜索了解决方案,并找到了一些针对javascript,Python和base R的解决方案,但没有找到针对stringer包的解决方案。

谢谢。

regex r stringr

4
推荐指数
1
解决办法
1534
查看次数

str_extract_all:返回在字符串中找到的所有模式连接为向量

我想提取除模式之外的所有内容并将其返回到字符串中。

我试图将 str_extract_all 与 sapply 和 cat 结合在一起

x = c("a_1","a_20","a_40","a_30","a_28")
data <- tibble(age = x)


# extracting just the first pattern is easy
data %>% 
  mutate(age_new = str_extract(age,"[^a_]"))
# combining str_extract_all and sapply doesnt work
data %>% 
  mutate(age_new = sapply(str_extract_all(x,"[^a_]"),function(x) cat(x,sep="")))


class(str_extract_all(x,"[^a_]"))
sapply(str_extract_all(x,"[^a_]"),function(x) cat(x,sep=""))
Run Code Online (Sandbox Code Playgroud)

返回 NULL 而不是串联模式

r stringr dplyr

4
推荐指数
1
解决办法
1228
查看次数

在R中使用str_extract在带有正则表达式的子字符串之前提取数字

我想在stringr包中使用str_extract从表单的字符串中提取数字XX nights etcetc

我目前正在这样做:

library(stringr)

str_extract("17 nights$5 Days", "(\\d)+ nights")
Run Code Online (Sandbox Code Playgroud)

但这又回来了

"17 nights"

代替17

如何只提取数字?我以为用括号指定提取组会起作用,但是没有用。

regex r stringr tidyverse

4
推荐指数
2
解决办法
103
查看次数

从整个句子中删除多余的空格

我有下面的变量

sen <- "I have a    sentence  "
Run Code Online (Sandbox Code Playgroud)

我只想从上面的句子中删除空格(所有空格,开头,结尾和中间的空格),我知道如何使用str_trim(sen),但这只删除开头和结尾的空格。我也想摆脱中间的空格

必填输出“我有一个句子”

string r trim stringr

4
推荐指数
1
解决办法
88
查看次数

标签 统计

r ×10

stringr ×10

tidyverse ×3

dplyr ×2

regex ×2

string ×2

and-operator ×1

grepl ×1

purrr ×1

stringi ×1

tidyr ×1

trim ×1