Как сопоставить и заменить строки в кадре данных в R? - PullRequest
1 голос
/ 28 марта 2019

У меня есть основной фрейм данных, в котором содержится множество веб-сайтов, с которыми я работаю, а другой фрейм данных содержит список плохих веб-сайтов, которые можно сопоставить и определить, есть ли у меня плохие веб-сайты в моем основном фрейме данных. Поскольку я очень новичок в этом, я не уверен, как сопоставить и заменить плохие веб-сайты на «www.badwebsite.com»? Спасибо.

Вот пример фреймов данных:

site_list <- data.frame("host" = c("www.companya.com", "www.companyb.com", "www.malwaresite.com",
                                   "www.companyc.com", "www.companyd.com", "www.virussite.com",
                                   "www.companye.com", "www.companyf.com", "www.phishingsite.com"),
                        "URL" = c("www.companya.com/home", "www.companyb.com/home", "www.malwaresite.com/home",
                                  "www.companyc.com/home", "www.companyd.com/home", "www.virussite.com/home",
                                  "www.companye.com/home", "www.companyf.com/home", "www.phishingsite.com/home"))

bad_site_list <- data.frame("host" = c("www.malwaresite.com", "www.virussite.com", "www.phishingsite.com"))

Я надеюсь достичь этого результата:

host                                  URL
www.companya.com               www.companya.com/home
www.companyb.com               www.companyb.com/home
www.badwebsite.com             www.badwebsite.com/home
www.companyc.com               www.companyc.com/home
www.companyd.com               www.companyd.com/home
www.badwebsite.com             www.badwebsite.com/home
www.companye.com               www.companye.com/home
www.companyf.com               www.companyf.com/home
www.badwebsite.com             www.badwebsite.com/home

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Без регулярных выражений вы могли бы сделать что-то вроде этого:

# Converting factor columsn to character
site_list[] <- lapply(site_list, as.character)
bad_site_list[] <- lapply(bad_site_list, as.character)

# If you want to replace all the bad sites with "www.badwebsite.com" you can:
site_list$URL[site_list$host %in% bad_site_list$host] <- "www.badwebsite.com/home"
site_list$host[site_list$host %in% bad_site_list$host] <- "www.badwebsite.com"

site_list
                host                     URL
1   www.companya.com   www.companya.com/home
2   www.companyb.com   www.companyb.com/home
3 www.badwebsite.com www.badwebsite.com/home
4   www.companyc.com   www.companyc.com/home
5   www.companyd.com   www.companyd.com/home
6 www.badwebsite.com www.badwebsite.com/home
7   www.companye.com   www.companye.com/home
8   www.companyf.com   www.companyf.com/home
9 www.badwebsite.com www.badwebsite.com/home

Используя регулярные выражения, вы могли бы примерно так:

# Using regex you could create a pattern 
bad_site_pattern <- paste(bad_site_list$host, collapse = "|")

# Then replace all instances in the dataframe using lapply
site_list[] <- lapply(site_list, gsub, pattern = bad_site_pattern, replacement = "www.badwebsite.com")

site_list
                host                     URL
1   www.companya.com   www.companya.com/home
2   www.companyb.com   www.companyb.com/home
3 www.badwebsite.com www.badwebsite.com/home
4   www.companyc.com   www.companyc.com/home
5   www.companyd.com   www.companyd.com/home
6 www.badwebsite.com www.badwebsite.com/home
7   www.companye.com   www.companye.com/home
8   www.companyf.com   www.companyf.com/home
9 www.badwebsite.com www.badwebsite.com/home
1 голос
/ 28 марта 2019

Я бы сделал это следующим образом для вашего простого примера, может быть не оптимальным для более сложных таблиц:

apply(site_list, 2, function(x)gsub(paste(bad_site_list$host, collapse="|"), "www.badwebsite.com", x))

In apply: "2" означает, что вы будете применять функцию к каждому столбцу ("1 "для применения на строку).
Функция ищет все хосты в bad_site_list и заменяет их на www.badwebsite.com (используя gsub)

0 голосов
/ 29 марта 2019

Загрузить библиотеку (stringr)

Поиск строки в векторе:

str_detect (имя_фрейма_данных, "string_your_searching_for")

Заменить строку в векторе:

str_replace (имя_фрейма_данных, "old_string", "new_string")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...