#r #string
#r #строка
Вопрос:
У меня есть набор данных, подобный приведенному ниже, известный как ключевое слово:
Результат выглядит следующим образом:
Логика выглядит следующим образом:
- Столбец foldercount — это не что иное, как число «/», присутствующее в столбце ссылки
- Столбец состояния имеет только 3 значения: родительский, дочерний и сиротский.
- Если в столбце Link нет ‘/ s’, статус этих ключевых слов будет — Сирота.
- Для конкретного ключевого слова, если ‘/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. Это решает мою задачу, но поскольку мой набор данных очень длинный, для получения результата требуется вечность. Есть ли какой-либо способ ускорить это?