我有一个带有因子列的大型数据框,我需要通过用分隔符分割因子名称来划分为三个因子列.这是我目前的方法,这是一个非常慢的大数据框架(有时数百万行):
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) 我说有一根绳子
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)
任何人都有想法为什么会这样?如何删除字符串中的"()"呢?
使用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)
不会为此目的而工作.
我想确定下面数据框中的字符串列是否在字符串的前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) 我有以下数据
id
00001
00010
00022
07432
Run Code Online (Sandbox Code Playgroud)
我想删除前导0s,因此数据需要以下内容
id
1
10
22
7432
Run Code Online (Sandbox Code Playgroud) 我有以下字符串向量.它包含两个元素.每个元素由两个折叠短语组成.
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)
我想在模式之后进行拆分,但无法弄清楚如何做到这一点.
我想我接近一个解决方案,并希望得到任何帮助.
我有一个非常混乱的数据框架,其中一列的值可以理解为人类而不是计算机,有点像下面的那样.
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) 这是我的数据框:
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 个点。我不知道如何处理有关正则表达式的问题。
有什么帮助吗?
这是我的 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函数来实现这一点?
我知道这个问题已经以不同的方式被问过多次,但我找不到一个解决方案,可以在保留边框的同时替换一些“边框”之间的文本。
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",所以它不再有单引号。
有任何想法吗?