Сравните два кадра данных и распечатайте обновленные строки в R - PullRequest
0 голосов
/ 09 ноября 2018

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

df1
firstname  lastname email
Grace       Holly   hollyoaks@yahoo.com
Trish       Edison  edisontrish@gmail.com

df2
firstname lastname  email
Grace     Holly     rickyoaks@yahoo.com
Frederick Sam       sammic@gmail.com

Первое, что я хотел сделать, это получить строки, которые были в df2, а не в df1, и вот как я это сделал:

require(sqldf)

df2NotIndf1 <- sqldf('SELECT * FROM df2 EXCEPT SELECT * FROM df1')

Это дало мне вывод:

`firstname lastname  email`
`Frederick Sam       sammic@gmail.com`

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

Итак, я хочу способ распечатать:

firstname  lastname  email

Grace     Holly     rickyoaks@yahoo.com

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

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

1) Если вы ищете способ перечислить тех людей, чье имя и фамилия указаны как в df1, так и в df2, но чьи электронные адреса отличаются, тогда:

sqldf("select df1.*, df2.email email2 
  from df1 
  join df2 on df1.firstname = df2.firstname and 
              df1.lastname = df2.lastname and 
              df1.email <> df2.email")

, даваяследующий, который показывает запись df1 и отличающееся электронное письмо от df2.

  firstname lastname               email              email2
1     Grace    Holly hollyoaks@yahoo.com rickyoaks@yahoo.com

2) или базовое решение будет:

subset(merge(df1, df2, by = 1:2), email.x != email.y)

Примечание

Вводимый в воспроизводимой форме ввод:

Lines1 <- "firstname  lastname email
Grace       Holly   hollyoaks@yahoo.com
Trish       Edison  edisontrish@gmail.com"

Lines2 <- "firstname lastname  email
Grace     Holly     rickyoaks@yahoo.com
Frederick Sam       sammic@gmail.com"

df1 <- read.table(text = Lines1, header = TRUE, as.is = TRUE, strip.white = TRUE)
df2 <- read.table(text = Lines2, header = TRUE, as.is = TRUE, strip.white = TRUE)
0 голосов
/ 09 ноября 2018

Сначала я создаю фреймы данных.

# Create data frames
df1 <- read.table(text = "firstname  lastname email
                  Grace       Holly   hollyoaks@yahoo.com
                  Trish       Edison  edisontrish@gmail.com", ,
                  header = TRUE, stringsAsFactors = FALSE)

df2 <- read.table(text = "firstname lastname  email
Grace     Holly     rickyoaks@yahoo.com
Frederick Sam       sammic@gmail.com", 
                  header = TRUE, stringsAsFactors = FALSE)

Далее загружаю dplyr.

# Load libraries
library(dplyr)

Здесь я выполняю соединение, чтобы найти строки в df2, которых нет в df1.

# Perform antijoin
df3 <- df2 %>% anti_join(df1, by = c("firstname", "lastname"))

#   firstname lastname            email
# 1 Frederick      Sam sammic@gmail.com

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

# Bind two data frames together
# Remove those only appearing in df2
# Filter to those with duplicates in all but one column
df1 %>% 
  bind_rows(df2) %>% 
  anti_join(df3) %>% 
  filter((duplicated(firstname, lastname) + duplicated(email, lastname) + duplicated(firstname, email)) == ncol(df1) - 1)

#   firstname lastname               email
# 1     Grace    Holly rickyoaks@yahoo.com

В настоящее время я думаю о более кратком способе записи строки filter, которая обобщается на произвольное количество столбцов.

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