Проблема с использованием dplyr на столбцах с векторными элементами [колонки списка] - PullRequest
0 голосов
/ 27 сентября 2018

Я сталкиваюсь с некоторыми проблемами при обработке текста с использованием функций 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"
)

Теперь я создаю новый столбец splitPhrase , выполнив str_split () для одного из столбцов, используя " и " в качестве разделителя.

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 .Другими словами, я хотел бы добраться до этого ...

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

Итак, я думаю, что "не понимаю", как работать с векторами, которые находятся внутри элемента в столбце таблицы / таблицы.Кажется, это как-то связано с тем, что в моем примере это на самом деле список векторов.

Есть ли какая-то особая функция, которая мне здесь поможет, или лучший способ добраться до этого?

Создан в 2018-09-27 пакетом представ. (v0.2.1)

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Не проверен на эффективность, но мы также можем использовать регулярные выражения для извлечения сегмента строки после последних "и":

С 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
0 голосов
/ 27 сентября 2018

Столбец splitPhrase представляет собой list, поэтому мы перебираем list, чтобы получить элементы

library(tidyverse)
df %>% 
   mutate(splitPhrase = str_split(phrase,"\\s*and\\s*"),
          Last = map_chr(splitPhrase, last)) %>%
   select(item, Last)

Но это можно сделать разными способами.Используя separate_rows, разверните столбец, затем получите элемент last, сгруппированный по 'item'

df %>% 
  separate_rows(phrase,sep = " and ") %>% 
  group_by(item) %>% 
  summarise(Last = last(phrase))
...