在使用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"
)
现在,我使用“ 和”作为分隔符,对其中一列进行 str_split(),以创建新列 splitPhrase 。
df <- df %>%
mutate(splitPhrase = str_split(phrase,"and"))
这似乎可行,在RStudio中,我看到了...
在控制台中,我看到我的新列splitPhrase实际上是由列表组成的...但是在Rstudio显示中看起来是正确的,对吧?
df
#> # A tibble: 3 x 3
#> item phrase splitPhrase
#> <chr> <chr> <list>
#> 1 one romeo and juliet <chr [2]>
#> 2 two laurel and hardy <chr [2]>
#> 3 three apples and oranges and pears and peaches <chr [4]>
我最终想要做的是提取每个splitPhrase 的 last 项目。换句话说,我想了解这个...
问题是我看不到如何仅捕获每个splitPhrase中的最后一个元素。如果只是矢量,我可以做这样的事情...
#> last( c("a","b","c") )
#[1] "c"
#>
但是在小标题中这是行不通的,其他的事情也没有想到:
df <- df %>%
mutate(lastThing = last(splitPhrase))
# Error in mutate_impl(.data, dots) :
# Column `lastThing` must be length 3 (the number of rows) or one, not 4
df <- df %>% group_by(splitPhrase) %>%
mutate(lastThing = last(splitPhrase))
# Error in grouped_df_impl(data, unname(vars), drop) :
# Column `splitPhrase` can't be used as a grouping variable because it's a list
因此,我认为我“无法理解”如何使用表格/标题栏中元素内部的向量。在我的示例中,它实际上是向量列表。
是否有一个特殊的功能可以帮助我解决这个问题,或者是一种更好的方法?
由reprex package(v0.2.1)于2018-09-27创建
答案 0 :(得分:1)
“ splitPhrase”列为list
,因此我们遍历list
以获取元素
library(tidyverse)
df %>%
mutate(splitPhrase = str_split(phrase,"\\s*and\\s*"),
Last = map_chr(splitPhrase, last)) %>%
select(item, Last)
但是,可以用很多方法来完成。使用separate_rows
展开列,然后获取按{item”分组的{{1}}元素
last
答案 1 :(得分:1)
尚未进行效率测试,但我们也可以使用正则表达式提取最后一个“和”之后的字符串段:
使用sub
:
library(dplyr)
df %>%
mutate(lastThing = sub("^.*and\\s", "", phrase)) %>%
select(-phrase)
使用str_extract
:
library(stringr)
df %>%
mutate(lastThing = str_extract(phrase, "(?<=and\\s)\\w+$")) %>%
select(-phrase)
使用extract
:
library(tidyr)
df %>%
extract(phrase, "lastThing", "^.*and\\s(\\w+)")
输出:
# A tibble: 3 x 2
item lastThing
<chr> <chr>
1 one juliet
2 two hardy
3 three peaches