该perl()函数在最新版本的 stringr 中已被弃用,取而代之的是regex(). 但是,我似乎无法复制早期的行为。
要将字符串向量的第一个字母大写,可以使用以下方法:
name <- c("jim", "john", "bill")
str_replace(name, perl("^(.)"), "\\U\\1")
Run Code Online (Sandbox Code Playgroud)
然而,这不再有效:
str_replace(name, regex("^(.)"), "\\U\\1")
Run Code Online (Sandbox Code Playgroud)
但使用基本 R 是有效的:
gsub("^(.)", "\\U\\1", name, perl=TRUE)
Run Code Online (Sandbox Code Playgroud)
还有办法用 stringr 包来做到这一点吗?
对于 R 来说还是比较新的。我有一列推文,我正在尝试创建一个包含转发句柄“RT @blahblah”的列,如下所示:
Tweets Retweetfrom
RT @john I had a good day RT @john
RT @josh I had a bad day RT @josh
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
r$Retweetfrom <- str_extract_all(r$Tweets, "^RT[:space:]+@[:graph:]+")
Run Code Online (Sandbox Code Playgroud)
它给了我正确的结果,但新列不是向量,而是列表。当我尝试取消列出它时,它会抛出一个错误:
Error in `$<-.data.frame`(`*tmp*`, "Retweetfrom", value = c("@AlpineITW", "@AllScienceGlobe", : replacement has 1168 rows, data has 2306
Run Code Online (Sandbox Code Playgroud)
有人知道如何处理这个问题吗?多谢。
我正在寻找的text_是:本周(3月25日 - 3月31日),国内油厂开机率继续下降,全国各地油厂大豆压榨总量1456000吨(出粕1157520吨,出油262080吨) ,较上周的... [续]
crush <- str_extract(string = text_, pattern = perl("(?<=?).*(?=????)"))
meal <- str_extract(string = text_, pattern = perl("(?<=?).*(?=???)"))
oil <- str_extract(string = text_, pattern = perl("(?<=??).*(?=??)"))
Run Code Online (Sandbox Code Playgroud)
版画
[1] "1456000" ## correct
[1] "1157520" ## correct
[1] NA ## looking for 262080 here
Run Code Online (Sandbox Code Playgroud)
为什么前两个匹配但不是最后一个匹配?我正在使用stringr图书馆.
我在使用 dplyr 和 stringr 函数(特别是 str_split())进行文本处理时遇到了一些问题。我认为我误解了在处理向量/列表元素时如何正确使用 dplyr 的一些非常基本的内容。
这是一个小问题,df ...
library(tidyverse)
df <- tribble(
~item, ~phrase,
"one", "romeo and juliet",
"two", "laurel and hardy",
"three", "apples and oranges and pears and peaches"
)
Run Code Online (Sandbox Code Playgroud)
现在,我通过使用“和”作为分隔符在其中一列上执行str_split()来创建一个新列splitPhrase 。
df <- df %>%
mutate(splitPhrase = str_split(phrase,"and"))
Run Code Online (Sandbox Code Playgroud)
这似乎可行,在 RStudio 中我看到了这个......
在控制台中,我看到我的新列 splitPhrase 实际上由列表组成...但它在 Rstudio 显示中看起来是正确的,对吧?
df
#> # A tibble: 3 x 3
#> item phrase splitPhrase
#> <chr> <chr> <list>
#> 1 one romeo and juliet <chr [2]>
#> …Run Code Online (Sandbox Code Playgroud) 我在 csv 导出中的编码方面遇到了困难。我来自荷兰,我们使用相当多的 Trema(例如\xc3\xab, \xc3\xaf)和重音符号(例如\xc3\xa9, \xc3\xb3)等。这会在导出到 csv 并在 Excel 中打开文件时出现问题。
在 macOS Mojave 上。
\n\n我已经尝试了多种编码功能,如下所示。
\n\nlibrary(stringr)\nlibrary(readr)\n\ntest <- c("Argentini\xc3\xab", "Belgi\xc3\xab", "Ha\xc3\xafti")\n\ntest %>%\n stringi::stri_conv(., "UTF-8", "ISO-8859-1") %>%\n write.csv2("~/Downloads/test.csv")\nRun Code Online (Sandbox Code Playgroud)\n\n但是,这仍然会导致奇怪的字符:
\n\n\n我试图使用 stringr::str_subset 函数在字符向量中查找与两个单词不特定顺序匹配的元素,而不仅仅是其中的任何一个单词。换句话说,我正在寻找两个单词的交集,而不是并集。
我尝试使用“或”(|) 运算符,但这只会给我两个单词之一,并返回太多结果。我还尝试仅传递一个字符向量,其中两个单词作为模式参数。这只会返回“较长对象长度不是较短对象长度的倍数”的错误,并且仅返回与两个单词中的第二个单词匹配的值。
character_vector <- c("abc ghi jkl mno def", "pqr abc def", "abc jkl pqr")
pattern <- c("def", "pqr")
str_subset(character_vector, pattern)
Run Code Online (Sandbox Code Playgroud)
我正在寻找仅返回字符向量的第二个元素的模式,即“pqr abc def”。
我在stringr包中使用str_detect,但在搜索具有多个模式的字符串时遇到问题。
这是我正在使用的代码,但是即使我的向量(“Notes-Title”)包含这些模式,它也不会返回任何内容。
filter(str_detect(`Notes-Title`, c("quantity","single")))
我想要编码的逻辑是:
搜索每一行并过滤它是否包含字符串“quantity”或“single”。
我尝试使用R、jiebaR和语料库生成一个词云并获取中文语音的词频,但无法制作语料库。这是我的代码:
library(jiebaR)
library(stringr)
library(corpus)
cutter <- worker()
v36 <- readLines('v36.txt', encoding = 'UTF-8')
seg_x <- function(x) {str_c(cutter[x], collapse = '')}
x.out <- sapply(v36, seg_x, USE.NAMES = FALSE)
v36.seg <- x.out
v36.seg
library(quanteda)
corpus <- corpus(v36.seg) #Error begins here.
summary(corpus, showmeta = TRUE, 1)
texts(corpus)[1]
tokens(corpus, what = 'fasterword')[1]
tokens <- tokens(v36.seg, what = 'fasterword')
dfm <- dfm(tokens)
dfm
Run Code Online (Sandbox Code Playgroud)
我的文本文件包含以下段落:
当我创建语料库时出现错误。R 返回:
Error in corpus.default(v36.seg) :
corpus() only works on character, corpus, Corpus, data.frame, kwic objects.
Run Code Online (Sandbox Code Playgroud)
我不明白为什么文本有问题。如果您能帮我解决问题,我将不胜感激。谢谢。
我是 R 新手,在 (1) 概括以前的堆栈溢出答案以适应我的情况,以及 (2) 理解 R 文档时遇到困难。所以我转向这个社区,希望有人能引导我度过难关。
\n\n我有这个代码,其中data1有一个文本文件:
data1 <- read.delim(file.choose())\npattern <- c("An Error Has Occurred!")\nstr_detect(data1, regex(pattern, ignore_case = FALSE))\nRun Code Online (Sandbox Code Playgroud)\n\n我看到的错误消息是:
\n\nargument is not an atomic vector; coercing[1] FALSE\nRun Code Online (Sandbox Code Playgroud)\n\n当我使用 is.vector() 确认数据类型时,看起来应该没问题:
\n\nis.vector(pattern)\n#this returns [1] TRUE as the output\nRun Code Online (Sandbox Code Playgroud)\n\n我用于 str_detect 函数的参考是https://www.rdocumentation.org/packages/stringr/versions/1.4.0/topics/str_detect。
\n\n编辑 1:data1这是- I\m试图匹配第四行到最后一行“发生错误!”的输出:
Silk.Road.Forums\n<fctr>\n*\nWelcome, Guest. Please login or register.\n[ ] [ ] [Forever] [Login]\nLogin with username, password and session …Run Code Online (Sandbox Code Playgroud) 我正在处理一些原始文本,并希望将所有多个空格替换为一个空格。通常,会使用 stringr's str_squish,但不幸的是它也删除了我必须保留的换行符(\n 和 \r)。
任何想法?以下是我的尝试。非常感谢!
library(tidyverse)
x <- "hello \n\r how are you \n\r all good?"
str_squish(x)
#> [1] "hello how are you all good?"
str_replace_all(x, "[:space:]+", " ")
#> [1] "hello how are you all good?"
str_replace_all(x, "\\s+", " ")
#> [1] "hello how are you all good?"
Run Code Online (Sandbox Code Playgroud)
由reprex 包(v0.3.0)于 2020-07-01 创建