R

时间:2016-03-28 15:30:58

标签: r dplyr

我在以下结构中有一个df:

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的条目)。我目前从df中对此数据进行子集化的方法是:

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%中的count函数,则使用dplyr会产生一个0 obs的数据帧而不是plyr

问题:如何避免此问题?如果我从头开始实现dplyr,我的脚本会更有效率。

顺便说一句,我知道dplyr::count使用&#34; n&#34;而不是&#34; freq&#34;

我附上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则不起作用。

2 个答案:

答案 0 :(得分:3)

您遇到了dplyr的违规行为。它的标准操作对象是&#34; tbl_df&#34;而不是更常见的&#34; data.frame&#34;。 (这是dplyr::count()返回的对象类。)通常说&#34; tbl_df&#34;只是一个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" 。要看到差异:

[

numbers应用于tbl_df会执行后者。在您的情况下,这意味着%in%是data.frame / tbl_df而不是向量。 numbers应用于data.frame会产生奇怪的事情,特别是您目前遇到的奇怪事情。

解决方案是从numbers[[1]]通过Repeat.Device <- All.CRM[All.CRM$Device.Phone.Number %in% numbers[[1]], ] 提取第一列(也是唯一一列)。如果您将最后一行代码更改为:

submit

它应该很好用。

答案 1 :(得分:2)

嗯,dplyr::countplyr::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')