我在以下结构中有一个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
则不起作用。
答案 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::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')