Arhn - архитектура программирования

Заполнение столбца фрейма данных с использованием регулярных выражений (?)

Итак, у меня есть фрейм данных комментариев веб-форума. В каждой строке есть ячейка, содержащая идентификатор, который является частью ссылки на родительский комментарий этого комментария. Строки содержат полную постоянную ссылку на комментарий, переменной частью которого является идентификатор.

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

С точки зрения рабочего процесса мне нужно найти строку, URL-адрес которой содержит идентификатор родительского комментария, и получить имя пользователя из этой строки. Вот пример игрушки:

toy <- rbind(c("yes?", "john", "www.website.com/4908", "3214", NA), c("don't think so", "mary", "www.website.com/3958", "4908", NA))
toy <- as.data.frame(toy)
colnames(toy) <- c("comment", "user", "URL", "parent", "parent_user")

         comment user                  URL parent parent_user
1           yes? john www.website.com/4908   3214        <NA>
2 don't think so mary www.website.com/3958   4908        <NA>

который должен стать:

         comment user                  URL parent parent_user
1           yes? john www.website.com/4908   3214        <NA>
2 don't think so mary www.website.com/3958   4908        john

Некоторые значения в этом столбце будут NA, так как это комментарии верхнего уровня. Так что-то вроде,

dataframe$parent_user <- dataframe['the row where parent
ID i is found in the URL column', 'the user name column in that row']

Спасибо!!

04.06.2016

Ответы:


1

Вот векторизованный вариант с stri_extract и match

library(stringi)
toy$parent_user <- toy$user[match(toy$parent,stri_extract(toy$URL, 
            regex=paste(toy$parent, collapse="|")))]
toy
#         comment user                  URL parent parent_user
#1           yes? john www.website.com/4908   3214        <NA>
#2 don't think so mary www.website.com/3958   4908        john

Или, как упомянул @jazzurro, более быстрым вариантом будет использование stri_extract с data.table и fmatch

library(data.table)
library(fastmatch)
setDT(toy)[, parent_user := user[fmatch(parent, 
                  stri_extract_last_regex(str=URL, pattern = "\\d+"))]]

Или вариант base R будет

with(toy, user[match(parent, sub("\\D+", "", URL))])
#[1] <NA> john
#Levels: john mary

nchar('with(toy, user[match(parent, sub("\\D+", "", URL))])')
#[1] 51

nchar('toy$user[match(toy$parent, basename(as.character(toy$URL)))]')
#[1] 60
04.06.2016
  • В аналогичной строке у меня было setDT(toy)[, parent_user := user[match(parent, stri_extract_last_regex(str = URL, pattern = "\\d+"))]]. 04.06.2016
  • Это упадет, если у вас есть номер в доменном имени - например. www.and1.com.au например. 05.06.2016
  • @thelatemail Если parentID равен 1, и OP хочет извлечь этот 1 из and1, опубликованный вами метод также должен дать сбой, то есть basename("www.and1.com.au") #[1] "www.and1.com.au" 05.06.2016
  • Я не предполагал, что они захотят извлечь 1 из and1, просто D+ запутается между доменом и идентификатором после косой черты. 05.06.2016
  • @thelatemail Да, неясно, встречается ли родительский идентификатор в конце или нет. 05.06.2016

  • 2

    Другой вариант, использующий функцию basename из базы R, которая "удаляет весь путь до последнего разделителя пути (если есть) включительно"

    toy$user[match(toy$parent, basename(as.character(toy$URL)))]
    #1] <NA> john
    #Levels: john mary
    
    04.06.2016
  • basename() в этом случае хорошая функция. Нашел кое-что новое из базы R. Спасибо. :) 04.06.2016
  • @jazzurro - и не забудьте его двоюродного брата - ?dirname :-) 04.06.2016
  • Да, это я тоже проверил. Спасибо. :-) 04.06.2016

  • 3

    Возможно, не самый красивый способ сделать это, но вариант:

    toy$parent_user <- sapply(toy$parent, 
                              function(x){p <- toy[x == sub('[^0-9]*', '', toy$URL), 'user'];
                                          ifelse(length(p) > 0, as.character(p), NA)})
    
    toy
    #          comment user                  URL parent parent_user
    # 1           yes? john www.website.com/4908   3214        <NA>
    # 2 don't think so mary www.website.com/3958   4908        john
    

    Вторая строка предназначена только для случаев отсутствия совпадений.

    04.06.2016
  • Да, не вижу полностью векторизованного подхода....str_extract() из stringr может выглядеть немного чище, но не заметно. Хорошее решение. 04.06.2016
  • Ох, если совместить подход akrun и мой, получится toy[match(toy$parent, sub('[^0-9]*', '', toy$URL)), 'user'], что на самом деле довольно неплохо, хотя я могу только отчасти отдать ему должное. 04.06.2016
  • @thelatemail О, я не думал использовать basename в URL-адресах! Я искал функцию для разбора элементов, но смог найти только xml2::url_relative. 04.06.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..