在带有向量元素的小标题上使用dplyr的问题[列表列]

时间:2018-09-27 19:25:18

标签: r dplyr stringr tibble

在使用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中,我看到了...

enter image description here

在控制台中,我看到我的新列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 项目。换句话说,我想了解这个...

enter image description here

问题是我看不到如何仅捕获每个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创建

2 个答案:

答案 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