Как grep в dplyr с мутацией - PullRequest
0 голосов
/ 01 мая 2018

Мне нужна помощь в понимании того, что происходит в моей трубе dplyr, и я прошу различные решения этой проблемы.

Проблема

У меня есть список институтов (формальный термин, по которому авторы статей родом из статьи в исследовательском журнале), и я хотел бы извлечь название основного института. Если это университет, это будет Univ. XX, и это пример, который я придерживаюсь здесь для простоты.

Логика попыток решения

  1. Разделите название института на запятую
  2. grep для термина "унив" или другого списка терминов, связанных с университетом
  3. извлечь индекс, где есть попадание

Краевые случаи / предположения

  • Термин, который я ищу, существует только в одном из разбиений
  • все институты здесь являются университетами (здесь проблема проста для переполнения стека)

код

df %>%
mutate(instGuess = unlist(strsplit(institute, ","))[grep("univ", unlist(strsplit(institute, ",")))][1]) %>%
 head()

То, что я предполагаю, происходит, но не происходит, это логика, которую я написал выше. Я вижу, что в mutate первый экземпляр institute находится в поиске КАЖДОЙ строки в df и точно такой же «университет новых, так что ~» заполняется. У меня есть общее представление о том, в чем ошибка кроме как без понятия, почему это происходит или как это исправить, сохраняя dplyr. Если я использую функцию apply, я могу сделать это, и мне любопытно, какие есть ответы SO.

Как это выглядит:

# A tibble: 6 x 2
  institute                                                                          instGuess              
  <chr>                                                                              <chr>                  
1 school of computer science and engineering, university of new south wales, sydney~ " university of new so~
2 department computer science, friedrich-alexander-university, erlangen-nuremberg, ~ " university of new so~
3 department of ece, pesit, bangalore, india                                         " university of new so~
4 school of information technology and electrical engineering, university of queens~ " university of new so~
5 school of information technology and electrical engineering, university of queens~ " university of new so~
6 dept. of info. syst. and comp. sci., national university of singapore, 10 kent ri~ " university of new so~

Данные, использованные для примера

df <- structure(list(institute = c("school of computer science and engineering, university of new south wales, sydney, australia", 
"department computer science, friedrich-alexander-university, erlangen-nuremberg, germany", 
"department of ece, pesit, bangalore, india", "school of information technology and electrical engineering, university of queenslandqld, australia", 
"school of information technology and electrical engineering, university of queenslandold, australia", 
"dept. of info. syst. and comp. sci., national university of singapore, 10 kent ridge crescent, singapore 119260, singapore"
), instGuess = c(" university of new south wales", " university of new south wales", 
" university of new south wales", " university of new south wales", 
" university of new south wales", " university of new south wales"
)), .Names = c("institute", "instGuess"), row.names = c(NA, -6L
), class = c("tbl_df", "tbl", "data.frame"))

Ответы [ 4 ]

0 голосов
/ 01 мая 2018

Вы можете использовать sub

a=df %>%
     group_by(institute)%>%
     mutate(Instname=sub("(.*,\\s|)(.*unive.*?)(,|$).*|.*","\\2",institute))
> a
# A tibble: 6 x 2
# Groups:   institute [6]
  institute                                                                                           Instname                   
  <chr>                                                                                               <chr>                      
1 school of computer science and engineering, university of new south wales, sydney, australia        university of new south wa~
2 department computer science, friedrich-alexander-university, erlangen-nuremberg, germany            friedrich-alexander-univer~
3 department of ece, pesit, bangalore, india                                                          ""                         
4 school of information technology and electrical engineering, university of queenslandqld, australia university of queenslandqld
5 school of information technology and electrical engineering, university of queenslandold, australia university of queenslandold
6 dept. of info. syst. and comp. sci., national university of singapore, 10 kent ridge crescent, sin~ national university of sin~
> a$Instname
[1] "university of new south wales"    "friedrich-alexander-university"   ""                                
[4] "university of queenslandqld"      "university of queenslandold"      "national university of singapore"
0 голосов
/ 01 мая 2018

Похоже, используется только первый элемент. Мы можем использовать rowwise, чтобы сгруппировать каждую строку и убедиться, что операция специфична для каждой строки.

library(dplyr)

df %>%
  rowwise() %>%
  mutate(instGuess = unlist(strsplit(institute, ","))[grep("univ", unlist(strsplit(institute, ",")))][1]) %>%
  ungroup() %>%
  head()
# # A tibble: 6 x 2
# institute                                                              instGuess             
#   <chr>                                                                  <chr>                 
# 1 school of computer science and engineering, university of new south w~ " university of new s~
# 2 department computer science, friedrich-alexander-university, erlangen~ " friedrich-alexander~
# 3 department of ece, pesit, bangalore, india                             NA                    
# 4 school of information technology and electrical engineering, universi~ " university of queen~
# 5 school of information technology and electrical engineering, universi~ " university of queen~
# 6 dept. of info. syst. and comp. sci., national university of singapore~ " national university~
0 голосов
/ 01 мая 2018

Я думаю, что ответ @Pdubbs является первым лучшим, где он использует group_by для имитации ответа @ www, который использует rowwise(), но разница (и, на мой взгляд, очевидное преимущество) состоит в том, что когда есть повторы $institute, эффективность достигается только за один раз, делая это предположение на институт.

Это идет на один шаг дальше и не повторяется strsplit в каждом случае. Я продублирую первый ряд:

df <- df[c(1,1:6),]

определяет функцию, которая выполняет работу, не дублируя strsplit:

find_univ <- function(x) {
  message('*', appendLF=FALSE)
  y <- strsplit(x[[1]], ',')[[1]]
  y[grep('univ', y)][1]
}

(и вставка вызова message, чтобы указать, сколько раз он вызывается ... не включать в производство), затем последовательность:

df %>%
  group_by(institute) %>%
  mutate(instGuess = find_univ(institute)) %>%
  ungroup() %>%
  select(instGuess) # for display purposes only
# ******  <---- six calls on seven rows, benefit of group_by
# A tibble: 7 × 1
#                           instGuess
#                               <chr>
# 1     university of new south wales
# 2     university of new south wales
# 3    friedrich-alexander-university
# 4                              <NA>
# 5       university of queenslandqld
# 6       university of queenslandold
# 7  national university of singapore

Я не знаю, насколько удачна эта дедупликация strsplit, хотя она полезна только при наличии большого количества данных. В противном случае это просто уровень эффективности OCD без «преждевременной оптимизации» .

0 голосов
/ 01 мая 2018

Вам нужно включить group_by, чтобы ваш синтаксис работал:

df %>%
  group_by(institute) %>%
  mutate(instGuess = unlist(strsplit(institute, ","))[grep("univ", unlist(strsplit(institute, ",")))][1])

Производит:

# A tibble: 6 x 2
# Groups:   institute [6]
institute                                                                  instGuess              
<chr>                                                                      <chr>                  
  1 school of computer science and engineering, university of new south wales… " university of new so…
2 department computer science, friedrich-alexander-university, erlangen-nur… " friedrich-alexander-…
3 department of ece, pesit, bangalore, india                                 NA                     
4 school of information technology and electrical engineering, university o… " university of queens…
5 school of information technology and electrical engineering, university o… " university of queens…
6 dept. of info. syst. and comp. sci., national university of singapore, 10… " national university …
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...