Идентификация родителя-потомка на основе символьной строки в R

#r #string

#r #строка

Вопрос:

У меня есть набор данных, подобный приведенному ниже, известный как ключевое слово:

введите описание изображения здесь

Результат выглядит следующим образом:

введите описание изображения здесь

Логика выглядит следующим образом:

  1. Столбец foldercount — это не что иное, как число «/», присутствующее в столбце ссылки
  2. Столбец состояния имеет только 3 значения: родительский, дочерний и сиротский.
  3. Если в столбце Link нет ‘/ s’, статус этих ключевых слов будет — Сирота.
  4. Для конкретного ключевого слова, если ‘/s’ присутствует в ссылке, а количество папок для этого конкретного ключевого слова наименьшее, тогда оно будет называться родительским. Любая другая ссылка с присутствующим ‘/s’ была бы дочерней. К родительскому элементу и дочернему элементу следует добавить номер, который должен помочь мне определить дочерний элемент, для которого конкретный родительский элемент, например, child1, является дочерним элементом parent1. Это может произойти для определенного ключевого слова, у нас вообще нет дочернего элемента.

Я использовал приведенный ниже код, но он не служит моей цели:

 Keyword$foldercount <- str_count(Keyword$URL, "/")
Keyword$last_char <- str_sub(Keyword$URL, -3,-1)
Keyword$last_char2 <- str_sub(Keyword$URL, -2,-1)

Keyword$isParent <- ifelse(Keyword$last_char == '/s/'| Keyword$last_char2 == '/s','Parent','Child')
Keyword$isParentDerivable <- "No"
h<- grep('/s/', Keyword$URL)
Keyword$isParentDerivable[h] <- "Y"
  

Комментарии:

1. Пожалуйста, поделитесь dput(Keyword) в качестве образца данных

Ответ №1:

Вы можете легко выполнить такую задачу с помощью dplyr Поскольку вы не предоставили образец данных, я составил несколько примеров:

  Keyword <- data.frame(Keyword = c("shoes", "shoes", "laptop", "laptop", "orp"),
                    Link = c("www.abc.com/shoes/s/",
                                "www.abc.com/shoes/s/page=1/",
                                "www.abc.com/laptop/s/",
                                "www.abc.com/laptop/s/page2/",
                                "www.abc.com/cdcd"),
                       stringsAsFactors = F)

 library(dplyr)
 Keyword %>%
   mutate(foldercount = str_count(Link, "/")) %>%
   group_by(Keyword) %>%
   mutate(flag = ifelse(foldercount == min(foldercount), 1, 0)) %>%
   mutate(Status = ifelse(n() == 1, "Orphan", "Child")) %>%
   mutate(Status = ifelse(flag == 1 amp; n() > 1, "Parent", Status)) %>%
   mutate(Status = ifelse(Status != "Orphan", paste(Status, Keyword, sep = "_"), Status)) %>%
   select(-flag)
# A tibble: 5 x 4
# Groups:   Keyword [3]
  Keyword Link                        foldercount Status       
  <chr>   <chr>                             <int> <chr>        
1 shoes   www.abc.com/shoes/s/                  3 Parent_shoes 
2 shoes   www.abc.com/shoes/s/page=1/           4 Child_shoes  
3 laptop  www.abc.com/laptop/s/                 3 Parent_laptop
4 laptop  www.abc.com/laptop/s/page2/           4 Child_laptop 
5 orp     www.abc.com/cdcd                      1 Orphan
  

Вы можете уменьшить количество шагов, как только хорошо разберетесь в конвейере.

Комментарии:

1. Несколько mutate вызовов кажутся своего рода «неуклюжими», хотя, возможно, в этом случае это улучшает читаемость. Можно было бы использовать один mutate вызов.

2. Это решает мою задачу, но поскольку мой набор данных очень длинный, для получения результата требуется вечность. Есть ли какой-либо способ ускорить это?