我想将一列字符串(例如[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) 我有字母和数字混合的字符串.我想分开他们并从他们那里判刑.
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.
样本数据
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.
我想使用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(模式)):较长的对象长度不是较短对象长度的倍数
我有一个数据框,其中每个条目都是一些字符串,用逗号分隔.我想用一种简洁的方法来按位置替换每个元素.
这是数据的玩具版本
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,而我需要全部替换它们.
是否有一个stringr等效grep与value设置为TRUE?(我想避免下面NA的stringr命令返回的。)
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) 如何使用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包的解决方案。
谢谢。
我想提取除模式之外的所有内容并将其返回到字符串中。
我试图将 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 而不是串联模式
我想在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。
如何只提取数字?我以为用括号指定提取组会起作用,但是没有用。
我有下面的变量
sen <- "I have a sentence "
Run Code Online (Sandbox Code Playgroud)
我只想从上面的句子中删除空格(所有空格,开头,结尾和中间的空格),我知道如何使用str_trim(sen),但这只删除开头和结尾的空格。我也想摆脱中间的空格
必填输出“我有一个句子”