Фильтрация данных для хранения до 10 дубликатов в двух переменных с отсутствующими данными - PullRequest
0 голосов
/ 23 апреля 2019

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

Используя R, я упорядочил данные по дате ответа и использовал следующий код для добавления подсчета дляадреса электронной почты и номера телефонов:

surveydata <- surveydata %>%
  group_by(email) %>%
  mutate(email_count = row_number())
surveydata <- surveydata %>%
  group_by(phone) %>%
  mutate(phone_count = row_number())

Я думал, что смогу просто отфильтровать записи, где email_count или phone_count было больше 10. Однако этот процесс также подсчитал все NA вместе, так что если я отфильтровал всеиз записей с числом больше 10, я бы удалил много записей, которые мы на самом деле хотим сохранить.

Я попробовал следующее утверждение if, чтобы попытаться сбросить значения email_count и phone_count, если адрес электронной почты или телефонные записибыли пустыми, но это не сработало:

# This doesn't work
if (is.na(surveydata$email)) {
surveydata$email_count = 0
}

Несмотря на то, что код выполнялся без ошибок, ни одна из записей без электронных писем не имела значения email_count равным 0.

Я использовал следующий кодсоздать новые таблицы данных, в которых перечислены адреса электронной почты и номера телефонов, которые встречаются более 10 раз:

dup_emails <- data.frame(table(surveydata$email))
dup_phones <- data.frame(table(surveydata$phone))
dup_emails <- dup_emails[dup_emails$Freq > 10,]
dup_phones <- dup_phones[dup_phones$Freq > 10,]

Я бы хотелЧтобы создать цикл For для проверки каждой строки в surveyydata, где, если адрес электронной почты или номер телефона совпадают с одним из адресов электронной почты или телефонных номеров в dup_emails или dup_phones, а значение email_count или phone_count превышает 10, тогда установите новую переменную "remove "to 1. После этого я мог бы отфильтровать любые данные, где" remove "= 1.

Я написал следующий код, но он не работает.Все значения для «удалить» остаются 0:

# This doesn't work
surveydata$remove <- 0
for (i in length(unique(dup_emails$Var1))) {
  if(surveydata$email == dup_emails[i,1] && thdsweeps$email_count > 10) {
    surveydata$remove <- 1
  }
}

Любая помощь или предложения будут с благодарностью!

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Я нашел решение.

Я создал новую переменную TRUE / FALSE, чтобы определить, были ли переменные электронной почты или телефона NA.

surveydata$email_remove <- is.na(surveydata$email)
surveydata$phone_remove <- is.na(surveydata$phone)

И затем отфильтровывались все строки, в которых количество адресов электронной почты или телефонов было больше 10, а переменные «remove» были FALSE.

surveydata_clean <- surveydata[!(surveydata$email_count > 10 & surveydata$email_remove == FALSE),]
surveydata_clean <- surveydata_clean[!(surveydata_clean$phone_count > 10 & surveydata_clean$phone_remove == FALSE),]
0 голосов
/ 23 апреля 2019

Попробуйте это:

surveydata <- surveydata %>%
 group_by(phone) %>%
 mutate(phone_count = row_number()) %>%
 ungroup() %>%
 group_by(email) %>%
 mutate(email_count = row_number()) %>%
 ungroup() %>%
 #keep the records that have missing values for emails and phone numbers
 filter(is.na(email)&is.na(phone))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...