Сравните строки в r и создайте фрейм данных - PullRequest
0 голосов
/ 11 января 2019

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

Скажи, что у меня есть df:

email <- c('abc@kjf.com', 'jkl@def.com', 'ghi@kjf.com', 'def@kjf.com' , 'mno@asdf.com')
website <- c('http://www.kjf.com', 'http://www.kjf.com', 'http://www.kjf.com', 'http://www.kjf.com', 'http://www.asdf.com')
df <- as.data.frame(cbind(email,website))

, что приводит к:

> df
        email            website
1 abc@kjf.com http://www.kjf.com
2 jkl@def.com http://www.kjf.com
3 ghi@kjf.com http://www.kjf.com
4 def@kjf.com http://www.kjf.com
5 mno@asdf.com http://www.asdf.com

Я хотел бы динамически создать 2 кадра данных. тот, где домен электронной почты совпадает с доменом сайта, как:

> df2
        email            website
1 abc@kjf.com http://www.kjf.com
2 ghi@kjf.com http://www.kjf.com
3 def@kjf.com http://www.kjf.com
4 mno@asdf.com http://www.asdf.com

и тот, который сохраняет несоответствие, как;

> df3
        email            website
1 jkl@def.com http://www.kjf.com

Я думаю, что я должен использовать "регулярное выражение", но я не уверен. Кто-нибудь видит, как это выполнимо, пожалуйста? Спасибо

Ответы [ 2 ]

0 голосов
/ 11 января 2019

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

library(tidyverse)

email <- c('abc@kjf.com', 'jkl@def.com', 'ghi@kjf.com', 'def@kjf.com' , 'mno@asdf.com')
website <- c('http://www.kjf.com', 'http://www.kjf.com', 'http://www.kjf.com', 'http://www.kjf.com', 'http://www.asdf.com')
df <- data.frame(
  email = email,
  website = website
)

df <- df %>% mutate(
  same = (email %>% str_sub(
    start = str_locate(., '@')[,'end'] + 1,
    end = -1L)) ==
    (website %>% str_sub(
      start = str_locate(., 'www.')[,'end'] + 1,
      end = -1L))
)

df2 <- df %>% filter(
  same
) %>% select(
  -same
)

df3 <- df %>% filter(
  !same
) %>% select(
  -same
)
0 голосов
/ 11 января 2019

Используя это, вы можете фильтровать строки

gsub('.*@', '', df$email) != gsub('https?://(www\\.)?', '', df$website)
# [1] FALSE  TRUE FALSE FALSE FALSE

Разбивка:

gsub('.*@', '', df$email)
###   .*   zero or more characters, followed by
###     @  a literal ampersand
# [1] "kjf.com"  "def.com"  "kjf.com"  "kjf.com"  "asdf.com"

и для URL:

gsub('https?://(www\\.)?', '', df$website)
###   http                literal string 'http'
###       s?              with exactly zero or one instance 's'
###         ://           literal string '://'
###            (www\\.)?  with exactly zero or one instance of 'www.'
# [1] "kjf.com"  "kjf.com"  "kjf.com"  "kjf.com"  "asdf.com"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...