第 10 章 stringr 習(xí)題匯總

有需要的小伙伴可以下載 PDF 版本(有書簽頁)查看鹏溯,附件中
https://www.yuque.com/erhuoqian/mudww7/mdsxrq

目錄

10.2.5

1 在沒有使用 stringr 的那些代碼中母债,你會經(jīng)常看到 paste() 和 paste0() 函數(shù),這兩個函數(shù)的區(qū)別是什么? stringr 中的哪兩個函數(shù)與它們是對應(yīng)的敬尺?這些函數(shù)處理 NA 的方式有什么不同?

2 用自己的語言描述一下 str_c() 函數(shù)的 sep 和 collapse 參數(shù)有什么區(qū)別贴浙?

3 使用 str_length() 和 str_sub() 函數(shù)提取出一個字符串最中間的字符砂吞。如果字符串中的字符數(shù)是偶數(shù),你應(yīng)該怎么做

4 str_wrap() 函數(shù)的功能是什么崎溃?應(yīng)該在何時使用這個函數(shù)蜻直?

5 str_trim() 函數(shù)的功能是什么?其逆操作是哪個函數(shù)?

6 編寫一個函數(shù)將字符向量轉(zhuǎn)換為字符串概而,例如呼巷,將字符向量 c("a", "b", "c") 轉(zhuǎn)換為字符串 "a, b and c"。仔細思考一下赎瑰,如果給定一個長度為 0王悍、1 或 2 的向量,那么這個函數(shù)應(yīng)該怎么做餐曼?

10.3.2

1 解釋一下為什么這些字符串不能匹配一個反斜杠 \ :""压储、""、""源譬。

2 如何匹配字符序列 "'\ 集惋?

3 正則表達式 ...... 會匹配哪種模式?如何用字符串來表示這個正則表達式踩娘?

10.3.4

1 如何匹配字符串 "$^$" 刮刑?

2 給定stringr::words 中的常用單詞語料庫,創(chuàng)建正則表達式以找出滿足下列條件的所有單詞霸饲。

a. 以 y 開頭的單詞为朋。

b. 以 x 結(jié)尾的單詞臂拓。

c. 長度正好為 3 個字符的單詞厚脉。(不要使用str_length() 函數(shù),這是作弊=憾琛)

d. 具有 7 個或更多字符的單詞傻工。

10.3.6

1 創(chuàng)建正則表達式來找出符合以下條件的所有單詞。

a. 以元音字母開頭的單詞孵滞。

b. 只包含輔音字母的單詞(提示:考慮一下匹配“非”元音字母)中捆。

c. 以 ed 結(jié)尾,但不以 eed 結(jié)尾的單詞坊饶。

d. 以 ing 或 ize 結(jié)尾的單詞泄伪。

2 實際驗證一下規(guī)則:i 總是在 e 前面,除非 i 前面有 c

3 q 后面總是跟著一個 u 嗎匿级?

4 編寫一個正則表達式來匹配英式英語單詞蟋滴,排除美式英語單詞。

5 創(chuàng)建一個正則表達式來匹配你所在國家的電話號碼痘绎。

10.3.8

1 給出與 ?津函、+ 和 * 等價的 {m, n} 形式的正則表達式用語言描述以下正則表達式匹配的是何種模式(仔細閱讀來確認我們使用的是正則表達式,還是定義正則表達式的字符串)孤页?

a. ^.*$

b. "{.+}"

c. \d{4}-\d{2}-\d{2}

d. "\{4}"

3 創(chuàng)建正則表達式來找出滿足以下條件的所有單詞尔苦。

a. 以 3 個輔音字母開頭的單詞。

b. 有連續(xù) 3 個或更多元音字母的單詞。

c. 有連續(xù) 2 個或更多元音—輔音配對的單詞

4 解一下 https://regexcrossword.com/challenges/beginner 中的正則表達式入門級縱橫字謎允坚。

10.3.10

用語言描述以下正則表達式會匹配何種模式魂那?

a. (.)\1\1

b. "(.)(.)\2\1"

c. (..)\1

d. "(.).\1.\1"

e. "(.)(.)(.).*\3\2\1"

2 創(chuàng)建正則表達式來匹配出以下單詞。

a. 開頭字母和結(jié)尾字母相同的單詞稠项。

b. 包含一對重復(fù)字母的單詞(例如冰寻,church 中包含了重復(fù)的ch)。

c. 包含一個至少重復(fù)3 次的字母的單詞(例如皿渗,eleven 中的e 重復(fù)了3 次)斩芭。

10.4.2

試著使用兩種方法來解決以下每個問題,一種方法是使用單個正則表達式乐疆,另一種方法是使用多個 str_detect() 函數(shù)的組合划乖。

a. 找出以 x 開頭或結(jié)尾的所有單詞。

b. 找出以元音字母開頭并以輔音字母結(jié)尾的所有單詞挤土。

c. 是否存在包含所有元音字母的單詞琴庵?

d. 哪個單詞包含最多數(shù)量的元音字母?哪個單詞包含最大比例的元音字母仰美?(提示:分母應(yīng)該是什么迷殿?)

10.4.4

1 在前面的示例中,你或許已經(jīng)發(fā)現(xiàn)正則表達式匹配了 flickered咖杂,這并不是一種顏色庆寺。修改正則表達式來解決這個問題。2 從 Harvard sentences 數(shù)據(jù)集中提取以下內(nèi)容诉字。

a. 每個句子的第一個單詞懦尝。

b. 以 ing 結(jié)尾的所有單詞。

c. 所有復(fù)數(shù)形式的單詞壤圃。

10.4.6

1 找出跟在一個數(shù)詞(one陵霉、two、three 等)后面的所有單詞伍绳,提取出數(shù)詞與后面的單詞踊挠。假設(shè)這里只考慮數(shù)字 1-10

2 找出所有縮略形式,分別列出撇號前面和后面的部分冲杀。

10.4.8

1 迷惑效床?使用反斜杠替換字符串中的所有斜杠

2 使用 replace_all() 函數(shù)實現(xiàn) str_to_lower() 函數(shù)的一個簡單版

3 交換 words 中單詞的首字母和末尾字母,其中哪些字符串仍然是個單詞漠趁?

10.4.10

1 拆分字符串"apples, pears, and bananas"

2 為什么使用boundary("word") 的拆分效果要比"" 好扁凛?

3 使用空字符串("")進行拆分會得到什么結(jié)果?嘗試一下闯传,然后閱讀文檔谨朝。

10.5

1 如何找出包含 \ 的所有字符串?分別使用 regex() 和 fixed() 函數(shù)來完成這個任務(wù)。

2 sentences 數(shù)據(jù)集中最常見的 5 個單詞是什么字币?

10.7

1 找出可以完成以下操作的 stringi 函數(shù)则披。

a. 計算單詞的數(shù)量。

b. 找出重復(fù)字符串洗出。

c. 生成隨機文本士复。

2 如何控制 stri_sort() 函數(shù)用來排序的語言設(shè)置?

[TOC]

10.2.5

1 在沒有使用 stringr 的那些代碼中翩活,你會經(jīng)弛搴椋看到 paste() 和 paste0() 函數(shù),這兩個函數(shù)的區(qū)別是什么菠镇? stringr 中的哪兩個函數(shù)與它們是對應(yīng)的冗荸?這些函數(shù)處理 NA 的方式有什么不同?

可以看出 paste 等同于 str_c 中的 sep 參數(shù)利耍,而 paste0 等同于 str_c 中的 collapse 參數(shù)蚌本。關(guān)于 NA 值,可以看到 paste 和 paste0 函數(shù)默認是把 NA 當(dāng)成一個字符串的隘梨,而 str_c 則會受 NA 的影響程癌,是可傳染的。

> paste("a", "b", sep = "_")
[1] "a_b"
> str_c("a", "b", sep = "_")
[1] "a_b"
> paste0("a", "_", "b")
[1] "a_b"
> str_c(c("a", "b"), collapse = "_")
[1] "a_b"
> # 關(guān)于 NA 值轴猎,可以看到 paste 和 paste0 函數(shù)默認是把 NA 當(dāng)成一個字符串的嵌莉,而 str_c 則會受 NA 的影響,是可傳染的税稼。
> paste("a", "b", sep = "_")
[1] "a_b"
> str_c("a", "b", sep = "_")
[1] "a_b"
> paste0("a", "_", "b")
[1] "a_b"
> str_c(c("a", "b"), collapse = "_")
[1] "a_b"
> paste("a", NA, sep = "_")
[1] "a_NA"
> str_c("a", NA, sep = "_")
[1] NA
> str_c("a", str_replace_na(NA), sep = "_")
[1] "a_NA"
> paste0("a", "_", NA)
[1] "a_NA"
> str_c(c("a", NA), collapse = "_")
[1] NA
> str_c(str_replace_na(c("a", NA)), collapse = "_")
[1] "a_NA"

2 用自己的語言描述一下 str_c() 函數(shù)的 sep 和 collapse 參數(shù)有什么區(qū)別烦秩?

  • sep 參數(shù)就是用來指定向量中字符串的連接符號
  • collapse 參數(shù)就是指定單個向量的內(nèi)連接也就是合并成一個字符串的連接符號

3 使用 str_length() 和 str_sub() 函數(shù)提取出一個字符串最中間的字符。如果字符串中的字符數(shù)是偶數(shù)郎仆,你應(yīng)該怎么做

擴展幾個函數(shù):
? floor:向下取整,即不大于該數(shù)字的最大整數(shù)
? ceiling:向上取整兜蠕,即不小于該數(shù)字的最小整數(shù)
? trunc:取整數(shù)部分
? round:保留幾位小數(shù)
? signif:保留幾位有效數(shù)字扰肌,常用于科學(xué)技術(shù)

test <- "abcde"
> test <- "abcde"
> median_p <- median(seq_len(str_length(test)))
> str_sub(test, median_p, me_p)
[1] "c"
# 如果是偶數(shù)
# 插播幾個函數(shù),取整熊杨、向上取整曙旭、向下取整
> test1 <- "abcdes"
> median_p1 <- ceiling(median(seq_len(str_length(test))))
> str_sub(test, median_p1, median_p1)
[1] "c"

4 str_wrap() 函數(shù)的功能是什么?應(yīng)該在何時使用這個函數(shù)晶府?

可以看到 str_wrap() 函數(shù)就是指定插入字符的位置桂躏,比如 width = 10,將會每十個字符(包括空格)加一個換行符 \n川陆。
? width:每一行的寬度剂习,正整數(shù)
? indent:每個段落第一行的非負整數(shù)縮進,即首行縮進
? exdent:非負整數(shù),在每個段落中給下行作縮進鳞绕,非首行縮進

> ?str_wrap
> test <- "R would not be what it is today without the invaluable help of these\npeople outside of the R core team"
> cat(str_wrap(test, width = 30), "\n")
R would not be what it is
today without the invaluable
help of these people outside
of the R core team 
> cat(str_wrap(test, width = 30, indent = 2), "\n")
  R would not be what it is
today without the invaluable
help of these people outside
of the R core team 
> cat(str_wrap(test, width = 30, exdent = 2), "\n")
R would not be what it is
  today without the invaluable
  help of these people outside
  of the R core team

用處:當(dāng)我們在做 GO失仁、KEGG 等情況下,文本內(nèi)容過長们何,需要換行展示萄焦,這時候就可以配合 str_wrap() 函數(shù)。詳情可參考 Y 叔的公眾號推文:ggplot2畫圖冤竹,文本太長了怎么辦拂封?

p + 
  scale_x_discrete(labels=function(x) str_wrap(x, width=10))

5 str_trim() 函數(shù)的功能是什么?其逆操作是哪個函數(shù)鹦蠕?

用來去除空白的函數(shù):
? str_trim() removes whitespace from start and end of string; 移除首尾
? str_squish() also reduces repeated whitespace inside a string烘苹;中間的也移除
都有一參數(shù) side:刪除空白的邊(left, right or both)

?str_trim()

逆操作函數(shù)為 str_pad() 加上空白
? width:加上字符后的字符長度,當(dāng)指定長度小于本身字符長度時候不會改變
? side:加在哪邊
? pad:填充字符片部,默認為空白

> str_pad("a", 10, pad = c("-", "_", " "))
[1] "---------a" "_________a" "         a"
> str_length(str_pad("hadley", 30, "left"))
[1] 30
當(dāng)指定長度小于本身字符長度時候不會改變
> str_pad("hadley", 3)
[1] "hadley"

6 編寫一個函數(shù)將字符向量轉(zhuǎn)換為字符串镣衡,例如,將字符向量 c("a", "b", "c") 轉(zhuǎn)換為字符串 "a, b and c"档悠。仔細思考一下廊鸥,如果給定一個長度為 0、1 或 2 的向量辖所,那么這個函數(shù)應(yīng)該怎么做惰说?

參考答案:
str_commasep <- function(x) {
  n <- length(x)
  if (n == 0) {
    NA
  }else if(n == 1){
    x
  }else if(n == 2){
    str_c(x[[1]], x[[2]], sep = " and ")
  }else{
    not_last <- str_c(x[seq_len(n - 1)], collapse = ", ")
    last <- str_c("and", x[[n]], sep = " ")
    str_c(c(not_last, last), collapse = " ")
  }
}
> str_commasep(c("a","b", "c"))
[1] "a, b and c"
> str_commasep(c("a","b"))
[1] "a and b"
> str_commasep(c("a"))
[1] "a"
> str_commasep("")
[1] ""

10.3.2

1 解釋一下為什么這些字符串不能匹配一個反斜杠 \ :""、"\"缘回、"\"吆视。

"":轉(zhuǎn)義符號 \ 后的一個字符
"\":這將解析到正則表達式中的 \,它將轉(zhuǎn)義正則表達式中的下一個字符酥宴。
"\":前兩個反斜杠將解析為正則表達式中的文字反斜杠啦吧,第三個將轉(zhuǎn)義下一個字符。在正則表達式中拙寡,它會轉(zhuǎn)義一些轉(zhuǎn)義的字符授滓。

2 如何匹配字符序列 "'\ ?

> writeLines("\"\'\\\\")
"'\\
> str_view("\"'\\", "\"\'\\\\")

3 正則表達式 ...... 會匹配哪種模式肆糕?如何用字符串來表示這個正則表達式般堆?

\..\..\.. 表示匹配 .任意字符.任意字符.任意字符,比如 .x.y.z诚啃。
> str_view(c(".a.b.c", ".a.b", "....."), c("\\..\\..\\.."), match = TRUE)

10.3.4

1 如何匹配字符串 "$^$" 淮摔?

> str_view(c("$^$", "ab$^$c"), "^\\$\\^\\$$")

2 給定stringr::words 中的常用單詞語料庫,創(chuàng)建正則表達式以找出滿足下列條件的所有單詞始赎。

因為這個列表非常長和橙,所以你可以設(shè)置 str_view() 函數(shù)的 match 參數(shù)仔燕,只顯示匹配的
單詞(match = TRUE)或未匹配的單詞(match = FALSE)。

a. 以 y 開頭的單詞胃碾。

以 y 開頭的單詞
> test <- stringr::words
> str_view(test, "^y", match = TRUE)

b. 以 x 結(jié)尾的單詞涨享。

以 x 結(jié)尾的單詞
> str_view(test, "x$", match = TRUE)
image

c. 長度正好為 3 個字符的單詞。(不要使用str_length() 函數(shù)仆百,這是作弊2匏怼)

長度正好為 3 個字符的單詞,太多俄周,截取部分圖
> str_view(test, "^...$", match = TRUE)

d. 具有 7 個或更多字符的單詞吁讨。

具有 7 個或更多字符的單詞
> str_view(test, ".......", match = TRUE)
或者
> reg1 <- str_c(rep(".", 7), collapse = "")
> str_view(test, reg1, match = TRUE)
或者
{7} 表示重復(fù)七次
> str_view(test, ".{7}", match = TRUE)
{7,} 表示重復(fù)七次及其以上
> str_view(test, ".{7,}", match = TRUE)
{7,9} 表示重復(fù)七次到九次

10.3.6

1 創(chuàng)建正則表達式來找出符合以下條件的所有單詞。

a. 以元音字母開頭的單詞峦朗。

> str_subset(stringr::words, "^[aeiou]")

b. 只包含輔音字母的單詞(提示:考慮一下匹配“非”元音字母)建丧。

> str_subset(stringr::words, "^[^aeiou]+$")

c. 以 ed 結(jié)尾,但不以 eed 結(jié)尾的單詞波势。

> str_subset(stringr::words, "[^e]ed$")

d. 以 ing 或 ize 結(jié)尾的單詞翎朱。

> str_subset(stringr::words, "i(ng|ze)$")

2 實際驗證一下規(guī)則:i 總是在 e 前面,除非 i 前面有 c

> length(str_subset(stringr::words, "ei"))
[1] 4
> length(str_subset(stringr::words, "ie"))
[1] 15
> 
> length(str_subset(stringr::words, "(cei|[^c]ie)"))
[1] 14
> length(str_subset(stringr::words, "(cie|[^c]ei)"))
[1] 3

3 q 后面總是跟著一個 u 嗎尺铣?

> length(str_subset(stringr::words, "q[^u]"))
[1] 0

4 編寫一個正則表達式來匹配英式英語單詞拴曲,排除美式英語單詞。

American and British English spelling differences

抄的答案凛忿,英式英語和美式英語的區(qū)別不是很清楚
英式英語
"ou" 而非 "o"
"ae" 或者 "oe" 而非 "a" 或者 "o"
以 "ise" 結(jié)尾而非 "ize"
以 "yse" 結(jié)尾
按照上面所列出的區(qū)別澈灼,可以通過以下來進行匹配排除美式英語單詞
ou|ise$|ae|oe|yse$

5 創(chuàng)建一個正則表達式來匹配你所在國家的電話號碼。

國際長途電話號碼格式

我們國家是十一位數(shù)字手機電話號碼店溢,emm叁熔,至于哪些能開頭哪些不能開頭沒細糾結(jié)。
> str_view(c("18271883605", "1293123"), "\\d{11}")

10.3.8

1 給出與 ?床牧、+ 和 * 等價的 {m, n} 形式的正則表達式

? 等價于 {0荣回,1}
+ 等價于 {1,}
* 等價于 {0,}

用語言描述以下正則表達式匹配的是何種模式(仔細閱讀來確認我們使用的是正則表達式,還是定義正則表達式的字符串)叠赦?

a. ^.*$

b. "\{.+\}"

c. \d{4}-\d{2}-\d{2}

d. "\\{4}"

^.*$
匹配所有字符
"\\{.+\\}"
匹配至少一個字符
\d{4}-\d{2}-\d{2}
匹配類似 1234-12-12 格式
"\\\\{4}"
匹配四個 \

3 創(chuàng)建正則表達式來找出滿足以下條件的所有單詞驹马。

a. 以 3 個輔音字母開頭的單詞。

b. 有連續(xù) 3 個或更多元音字母的單詞除秀。

c. 有連續(xù) 2 個或更多元音—輔音配對的單詞

以 3 個輔音字母開頭的單詞
> str_view(words, "^[^aeiou]{3}", match = TRUE)
有連續(xù) 3 個或更多元音字母的單詞
> str_view(words, "[aeiou]{3,}", match = TRUE)
有連續(xù) 2 個或更多元音—輔音配對的單詞
> str_view(words, "([^aeiou][aeiou]){2,}", match = TRUE)

4 解一下 https://regexcrossword.com/challenges/beginner 中的正則表達式入門級縱橫字謎。

10.3.10

用語言描述以下正則表達式會匹配何種模式算利?

a. (.)\1\1

b. "(.)(.)\2\1"

c. (..)\1

d. "(.).\1.\1"

e. "(.)(.)(.).*\3\2\1"

看到此題有沒有聯(lián)想到我們的生物序列册踩?

a. (.)\1\1
匹配得到類似 aaa 結(jié)構(gòu)的字符串
> str_subset(c("aaa", "Abc"), "(.)\\1\\1")
[1] "aaa"
b. "(.)(.)\\2\\1"
匹配類似 abba 結(jié)構(gòu)的字符串
> str_view(words, "(.)(.)\\2\\1", match = T)
c. (..)\1
匹配類似 abab 結(jié)構(gòu)的字符串
> str_view(words, "(..)\\1", match = T)
d. "(.).\\1.\\1"
匹配類似 a*a*a 結(jié)構(gòu)的字符串,* 為任意一個字符
> str_view(words, "(.).\\1.\\1", match = T)
e. "(.)(.)(.).*\\3\\2\\1"
匹配類似 abc****cba 結(jié)構(gòu)的字符串效拭,*中不限制長度
> str_view(words, "(.)(.)(.).*\\3\\2\\1", match = T)

2 創(chuàng)建正則表達式來匹配出以下單詞暂吉。

a. 開頭字母和結(jié)尾字母相同的單詞。

b. 包含一對重復(fù)字母的單詞(例如,church 中包含了重復(fù)的ch)奸忽。

c. 包含一個至少重復(fù)3 次的字母的單詞(例如甩骏,eleven 中的e 重復(fù)了3 次)。

a. 開頭字母和結(jié)尾字母相同的單詞
\\1?$ 將只有一個字符的考慮進來
"^(.)((.*\\1$)|\\1?$)"
> str_view(words, "^(.)((.*\\1$)|\\1?$)", match = TRUE)
b. 包含一對重復(fù)字母的單詞(例如肮街,church 中包含了重復(fù)的 ch)风题。
".*(.)(.).*\\1\\2"
這個算是不大對的,因為 . 包括了所有字符嫉父,包括數(shù)字
> str_view(words, ".*(.)(.).*\\1\\2", match = TRUE)
或者, 標(biāo)準(zhǔn)應(yīng)該是這個
> str_view(words, "([a-zA-Z][a-zA-Z]).*\\1", match = TRUE)
c. 包含一個至少重復(fù) 3 次的字母的單詞(例如沛硅,eleven 中的 e 重復(fù)了 3 次)。
> str_view(words, "([a-zA-Z]).*\\1.*\\1", match = TRUE)

10.4.2

試著使用兩種方法來解決以下每個問題绕辖,一種方法是使用單個正則表達式摇肌,另一種方法是使用多個 str_detect() 函數(shù)的組合。

a. 找出以 x 開頭或結(jié)尾的所有單詞仪际。

b. 找出以元音字母開頭并以輔音字母結(jié)尾的所有單詞围小。

c. 是否存在包含所有元音字母的單詞?

d. 哪個單詞包含最多數(shù)量的元音字母树碱?哪個單詞包含最大比例的元音字母肯适?(提示:分母應(yīng)該是什么?)

找出以 x 開頭或結(jié)尾的所有單詞赴恨。
> 使用 str_detect() 函數(shù)
> words[str_detect(words, "(^x|x$)")]
[1] "box" "sex" "six" "tax"
> str_subset(words, "(^x|x$)")
[1] "box" "sex" "six" "tax"
> str_view(words, "(^x|x$)", match = T)
找出以元音字母開頭并以輔音字母結(jié)尾的所有單詞
> str_subset(words, "^[aeiou].*[^aeiou]$")
> words[str_detect(words, "^[aeiou].*[^aeiou]$")]
哪個單詞包含最多數(shù)量的元音字母疹娶?哪個單詞包含最大比例的元音字母?
包含最多數(shù)量的元音字母的單詞
> max_number <- max(str_count(words, "[aeiou]"))
> temp1 <- words[which((str_count(words, "[aeiou]") == max_number))]
> temp1
[1] "appropriate" "associate"   "available"   "colleague"   "encourage"   "experience"  "individual"  "television" 
包含最大比例的元音字母的單詞
> ratio <- str_count(temp1, "[aeiou]")/str_length(temp1)
> temp1[ratio == max(ratio)]
[1] "associate" "available" "colleague" "encourage"

疑問:是否存在包含所有元音字母的單詞伦连?

> words[str_detect(words, "a") &
      str_detect(words, "e") &
        str_detect(words, "i") &
        str_detect(words, "o") &
        str_detect(words, "u")
      ]
character(0)

不存在雨饺。

10.4.4

1 在前面的示例中,你或許已經(jīng)發(fā)現(xiàn)正則表達式匹配了 flickered惑淳,這并不是一種顏色额港。修改正則表達式來解決這個問題。

之前匹配項
> colors <- c(
  "red", "orange", "yellow", "green", "blue", "purple"
)
> color_match <- str_c(colors, collapse = "|")
> color_match
[1] "red|orange|yellow|green|blue|purple"
# 修改
## 我們在 10.3.3 中學(xué)過 \b:表示匹配單詞間的邊界歧焦。
> color_match2 <- str_c("\\b(", str_c(colors, collapse = "|"), ")\\b")
> color_match2
[1] "\\b(red|orange|yellow|green|blue|purple)\\b"
> more2 <- sentences[str_count(sentences, color_match2) > 1]
> str_view_all(more2, color_match2, match = TRUE)

2 從 Harvard sentences 數(shù)據(jù)集中提取以下內(nèi)容移斩。

a. 每個句子的第一個單詞。

b. 以 ing 結(jié)尾的所有單詞绢馍。

c. 所有復(fù)數(shù)形式的單詞向瓷。

每個句子的第一個單詞
> str_extract(sentences, "[A-Za-z]+") %>% 
  head()
[1] "The"   "Glue"  "It"    "These" "Rice"  "The" 
以 ing 結(jié)尾的所有單詞。
> pattern <- "\\b[A-Za-z]+ing\\b"
> sentences_with_ing <- str_detect(sentences, pattern)
> unique(unlist(str_extract_all(sentences[sentences_with_ing], pattern)))
所有復(fù)數(shù)形式的單詞
答案雖然給的是這個舰涌,但是并不是所有的復(fù)數(shù)都是以 s 或者 es 結(jié)尾
> unique(unlist(str_extract_all(sentences, "\\b[A-Za-z]{3,}s\\b"))) %>%
   head()
[1] "planks" "days"   "bowls"  "lemons" "makes"  "hogs"

10.4.6

1 找出跟在一個數(shù)詞(one猖任、two、three 等)后面的所有單詞瓷耙,提取出數(shù)詞與后面的單詞朱躺。假設(shè)這里只考慮數(shù)字 1-10

  • \b:單詞邊界
  • \w:任意單詞字符
  • \W:任意非單詞字符
> numword <- "\\b(one|two|three|four|five|six|seven|eight|nine|ten) +(\\w+)"
> sentences[str_detect(sentences, numword)] %>%
  str_extract(numword)

2 找出所有縮略形式刁赖,分別列出撇號前面和后面的部分。

> contraction <- "([A-Za-z]+)'([A-Za-z]+)"
> sentences[str_detect(sentences, contraction)] %>%
  str_extract(contraction) %>%
  str_split("'")
這里的縮略形式指的是通過 ' 連接的單詞  
這里僅僅列出部分結(jié)果

10.4.8

1 迷惑长搀?使用反斜杠替換字符串中的所有斜杠

這里是有點迷惑的宇弛,替換后并沒有直接變成 \,而是得通過 writeLines 函數(shù)來實現(xiàn)真正的替換源请。
> test <- c("a/b", "a/b//v")
> writeLines(str_replace_all(test, "/", "\\\\"))
a\b
a\b\\v

2 使用 replace_all() 函數(shù)實現(xiàn) str_to_lower() 函數(shù)的一個簡單版

> LETTERS2letters <- letters
> names(LETTERS2letters) <- LETTERS
> str_replace_all(words, LETTERS2letters)

3 交換 words 中單詞的首字母和末尾字母枪芒,其中哪些字符串仍然是個單詞?

> test <- str_replace_all(words, "^([A-Za-z])(.*)([a-z])$", "\\3\\2\\1")
> intersect(test, words)
剛開始我是沒看懂后面仍是一個單詞是啥意思巢钓,看了答案才發(fā)現(xiàn)就是首位相同字母的單詞病苗?看了答案后其實仍然覺得怪怪的

在 10.3.10 練習(xí)中有一題就是首尾字母相同的。

> data <- c("abba", "abc", "a")
> str_view(data, "^(.)((.*\\1$)|\\1?$)", match = T)
運用到本例子中:
> words1 <- str_to_lower(words)
> test2 <- str_subset(words1, "^(.)((.*\\1$)|\\1?$)")
> test2
> words1 <- str_to_lower(words)
> test2 <- str_subset(words1, "^(.)((.*\\1$)|\\1?$)")
> test <- str_replace_all(words1, "^([A-Za-z])(.*)([a-z])$", "\\3\\2\\1")
> test_1 <- intersect(test, words1)
> setdiff(test_1, test2)
[1] "lead" "read" "god"  "dog"  "deal" "on"   "no"   "dear"
> setdiff(test2, test_1)
character(0)
額症汹, 猜錯了硫朦,哈哈

10.4.10

1 拆分字符串"apples, pears, and bananas"

> x <- c("apples, pears, and bananas")
> str_split(x, ", +(and +)?")[[1]]
[1] "apples"  "pears"   "bananas"
要善于利用 ? 表示一次或者沒有

2 為什么使用boundary("word") 的拆分效果要比"" 好?

> x <- "This is a sentence. This is another sentence."
> str_split(x, boundary("word"))[[1]]
[1] "This"     "is"       "a"        "sentence" "This"     "is"       "another"  "sentence"
近乎等同于
> str_split(x, " ")[[1]]
[1] "This"      "is"        "a"         "sentence." "This"      "is"        "another"   "sentence."
但是我們可以看到背镇,如果使用 " " 來拆分咬展,會把點 . 等符號包括在一個單詞中

3 使用空字符串("")進行拆分會得到什么結(jié)果?嘗試一下瞒斩,然后閱讀文檔破婆。

我們可以看到使用 "" 拆分后一句話變成了單個的字符,空格也是胸囱。

> x <- "This is a sentence. This is another sentence."
> str_split(x, "")
[[1]]
 [1] "T" "h" "i" "s" " " "i" "s" " " "a" " " "s" "e" "n" "t" "e" "n" "c" "e" "." " " "T" "h" "i" "s" " " "i" "s" " " "a" "n" "o"
[32] "t" "h" "e" "r" " " "s" "e" "n" "t" "e" "n" "c" "e" "."
使用 boundary() 時候等同于上面祷舀。
> str_split(x, boundary())
[[1]]
 [1] "T" "h" "i" "s" " " "i" "s" " " "a" " " "s" "e" "n" "t" "e" "n" "c" "e" "." " " "T" "h" "i" "s" " " "i" "s" " " "a" "n" "o"
[32] "t" "h" "e" "r" " " "s" "e" "n" "t" "e" "n" "c" "e" "."

10.5

1 如何找出包含 \ 的所有字符串?分別使用 regex() 和 fixed() 函數(shù)來完成這個任務(wù)烹笔。

> str_subset(c("a\\b", "ab"), "\\\\")
[1] "a\\b"
> str_subset(c("a\\b", "ab"), fixed("\\"))

2 sentences 數(shù)據(jù)集中最常見的 5 個單詞是什么裳扯?

思路就是提取所有單詞,然后取消 list, 全統(tǒng)一小寫谤职,再統(tǒng)計數(shù)目
這種一般可以用來分析云詞匯圖
> tibble(word = unlist(str_extract_all(sentences, boundary("word")))) %>%
  mutate(word = str_to_lower(word)) %>%
  count(word, sort = T) %>%
  slice(1:5)
# A tibble: 5 x 2
  word      n
  <chr> <int>
1 the     751
2 a       202
3 of      132
4 to      123
5 and     118

10.7

1 找出可以完成以下操作的 stringi 函數(shù)饰豺。

a. 計算單詞的數(shù)量。

b. 找出重復(fù)字符串允蜈。

c. 生成隨機文本冤吨。

計算單詞的數(shù)量。
> stringi::stri_count_words(sentences) %>%
  head(5)
[1] 8 8 9 9 7
找出重復(fù)字符串饶套,
 R 中很多函數(shù)你都可以根據(jù)對應(yīng)功能的英文名來進行推測
> test <- c("a", "b", "c", "a")
> test[stringi::stri_duplicated(test)]
[1] "a"
生成隨機文本漩蟆。
看答案。妓蛮。
> stringi::stri_rand_strings(4, 5)
[1] "auldB" "GBdbU" "UUZmd" "SisRN"
打亂原本句子中單詞的順序
> stringi::stri_rand_shuffle("The brown fox jumped over the lazy cow.")
[1] " hwobeT oe dharjvl xpyuer eof.c zwom nt"
> stringi::stri_rand_lipsum(1)

2 如何控制 stri_sort() 函數(shù)用來排序的語言設(shè)置爆安?

> string1 <- c("hladny", "chladny")
> stringi::stri_sort(string1, locale = "pl_PL")
[1] "chladny" "hladny" 
> stringi::stri_sort(string1, locale = "sk_SK")
[1] "hladny"  "chladny"
> string2 <- c("number100", "number2")
> stringi::stri_sort(string2)
[1] "number100" "number2"  
> 
> stringi::stri_sort(string2, opts_collator = stringi::stri_opts_collator(numeric = TRUE))
[1] "number2"   "number100"

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仔引,隨后出現(xiàn)的幾起案子扔仓,更是在濱河造成了極大的恐慌,老刑警劉巖咖耘,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翘簇,死亡現(xiàn)場離奇詭異,居然都是意外死亡儿倒,警方通過查閱死者的電腦和手機版保,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夫否,“玉大人彻犁,你說我怎么就攤上這事』舜龋” “怎么了汞幢?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長微谓。 經(jīng)常有香客問我森篷,道長,這世上最難降的妖魔是什么豺型? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任仲智,我火速辦了婚禮,結(jié)果婚禮上姻氨,老公的妹妹穿的比我還像新娘钓辆。我一直安慰自己,他們只是感情好肴焊,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布前联。 她就那樣靜靜地躺著,像睡著了一般抖韩。 火紅的嫁衣襯著肌膚如雪蛀恩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天茂浮,我揣著相機與錄音双谆,去河邊找鬼。 笑死席揽,一個胖子當(dāng)著我的面吹牛顽馋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幌羞,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼寸谜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了属桦?” 一聲冷哼從身側(cè)響起熊痴,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤他爸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后果善,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诊笤,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年巾陕,在試婚紗的時候發(fā)現(xiàn)自己被綠了讨跟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡鄙煤,死狀恐怖晾匠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梯刚,我是刑警寧澤凉馆,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站乾巧,受9級特大地震影響句喜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沟于,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一咳胃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旷太,春花似錦展懈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至睡毒,卻和暖如春来惧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背演顾。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工供搀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钠至。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓葛虐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棉钧。 傳聞我的和親對象是個殘疾皇子屿脐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359