2016-03-28 4 views
0

У меня есть ФР в следующей структуре:% в% Изменение dplyr пакета в R

Case.No  Device.Phone.Number  Repair.Code 
123   111-111-1111   RA10 
234   222-222-2222   RA21 
345   111-111-1111   RA99 
456   333-333-3333   RA01 
567   222-222-2222   RA47 
...   ...      ... 
789   333-333-3333   RA90 

Есть еще несколько 70 колонн, но не интерес к этому вопросу.

Я анализирую данные повторных звонящих (записи с тем же связанным с ними Device.Phone.Number). Мой текущий метод Подмножества этих данных из ФРА:

library("plyr", lib.loc="~/R/R-3.2.2/library") 
Call.Count <- count(df$Device.Phone.Number) 
Repeat.Calls <- Call.Count[Call.Count$freq > 1, ] 
numbers <- Repeat.Calls[1:nrow(Repeat.Calls),1] 
Repeat.Device <- df[df$Device.Phone.Number %in% numbers, ] 

Я бы предпочел использовать пакет dplyr по всему сценарию, но мое использование %in% дает dataframe с 0 набли, если я использую функцию count из dplyr а не от plyr.

Вопрос: Как я могу избежать этой проблемы? Мой скрипт будет намного более эффективным, если я смогу реализовать dplyr с самого начала.

Как и в сторону, я знаю, что dplyr::count использует «п» вместо «FREQ»

Я приложил dplyr и изменил мой синтаксис, как это предписано @Konrad.

Call.Count <- count(Clean.CRM, Device.Phone.Number) 
Repeat.Calls <- Call.Count[Call.Count$n > 1, ] 
numbers <- Repeat.Calls[1:nrow(Repeat.Calls),1] 
Repeat.Device <- All.CRM[All.CRM$Device.Phone.Number %in% numbers, ] 

Но теперь с помощью %in% в то время как dplyr прилагается не работает.

+0

Я предполагаю, что вы попадаете под атипичные правила подмножества dplyr. Что такое 'class (numbers)'? Это вектор или «tbl_df»? – Thomas

+0

@Thomas - 'class (numbers)' returns '[1]" tbl_df "" data.frame "' –

ответ

3

Вы столкнулись с нарушениями dplyr в. Его стандартный рабочий объект - это «tbl_df», а не более общий «data.frame». (Это класс объекта, возвращаемый dplyr::count().) Часто говорят, что «tbl_df» - это всего лишь data.frame, что верно, но он воспроизводит очень разные правила. Вы встречаетесь с одним из них здесь.

Разница в том, что правила подмножества/извлечения tbl_df не устанавливаются drop = TRUE, тогда как метод [ для стандартного data.frame. Чтобы увидеть разницу:

mtcars[, "mpg", drop = TRUE] # a vector 
mtcars[, "mpg", drop = FALSE] # a one-column data.frame 
dplyr::tbl_df(mtcars)[,"mpg"] # a one-column "tbl_df" 

Применив [ к tbl_df делает последнего. В вашем случае это означает, что numbers является data.frame/tbl_df, а не вектором. %in% применяется к data.frame делает странные вещи, в особенности странную вещь, которую вы в настоящее время испытываете.

Решение состоит в том, чтобы извлечь первую (и только) колонку от numbers через numbers[[1]].Если вы изменили свою последнюю строку кода на:

Repeat.Device <- All.CRM[All.CRM$Device.Phone.Number %in% numbers[[1]], ] 

Должно работать хорошо.

+0

Отлично !!! Большое спасибо за ваш ответ и даже больше за подробное объяснение. –

2

Ну, dplyr::count отличается от plyr::count. И ни один из них не должен использоваться так, как вы используете его здесь (хотя plyr принимает это использование, dplyr - нет).

В plyr, вы должны написать:

Call.Count <- count(df, 'Device.Phone.Number') 

В dplyr, вы необходимо написать:

Call.Count <- count(df, Device.Phone.Number) 
# or 
Call.Count <- count_(df, 'Device.Phone.Number') 
+0

Спасибо, @konrad - Мне известно о синтаксисе, который вы указываете для 'dplyr :: count', потому что я использую это функции в другом месте. Но даже при использовании '% in%' для назначения 'Repeat.Device' не работает, как я ожидаю. Это вопрос, который я надеюсь решить. –

+1

@el_dewey, если строка с '% in%' является вашей проблемой, вы должны исправить ошибки синтаксиса, которые у вас есть до этого. То есть, используйте действительный синтаксис для 'dplyr :: count', как показывает Конрад, прежде чем пытаться использовать'% in% '. – Gregor

Смежные вопросы