【问题标题】:how to search with number of occurrences in factor如何使用因子中的出现次数进行搜索
【发布时间】:2016-10-09 08:20:33
【问题描述】:

找出三部电影在同一天上映的日期并将其存储在变量 date_three 中

releasedate<-count(bollywood$Rdate)

> releasedate

            x freq
1  01-05-2015    1
2  02-10-2015    2
3  03-07-2015    1
4  04-09-2015    1
5  04-12-2015    1
6  05-06-2015    1
7  06-02-2015    1
8  06-03-2015    1
9  07-08-2015    1
10 08-05-2015    2
11 09-01-2015    1
12 09-10-2015    1
13 10-04-2015    1
14 11-09-2015    1
15 12-06-2015    1
16 12-11-2015    1
17 13-02-2015    1
18 13-03-2015    1
19 14-08-2015    1
20 15-05-2015    1
21 16-01-2015    1
22 16-10-2015    1
23 17-04-2015    1
24 17-07-2015    1
25 18-09-2015    1
26 18-12-2015    2
27 19-06-2015    1
28 20-02-2015    1
29 20-03-2015    1
30 21-08-2015    2
31 22-05-2015    1
32 22-10-2015    1
33 23-01-2015    2
34 25-09-2015    2
35 26-06-2015    1
36 27-02-2015    2
37 27-11-2015    1
38 28-05-2015    1
39 28-08-2015    1
40 30-01-2015    2
41 30-10-2015    3
42 31-07-2015    1

>subset(releasedate$x,releasedate$freq==3)
>[1] 30-10-2015
42 Levels: 01-05-2015 02-10-2015 03-07-2015 04-09-2015 04-12-2015 ... 31-07-2015

有没有其他方法可以通过出现次数来搜索向量中的元素?

【问题讨论】:

  • 您到底需要什么与您现有的解决方案不同?还有其他方法可以做任何事情。
  • 我需要找出 3 部电影的上映日期。我找到了一种解决方案,方法是使用 plyr 包,然后使用 count 函数将 x 和 freq 存储在 releaseate 中,然后将 x 设置为 freq=3 的子集。还有其他方法吗?
  • 您可以使用基础 R 中的 aggregate 或通过 .N 使用 data.table 来执行此操作。
  • 你能写出上面代码的例子,如何使用聚合和data.table。谢谢
  • 你的数据在哪里?

标签: r filter count grouping


【解决方案1】:

dplyr:

library(dplyr)

date_three = bollywood %>% count(Rdate) %>% filter(n >= 3)

data.table:

library(data.table)

date_three = setDT(bollywood)[ , list(freq=.N), by = Rdate ][freq >= 3]

或者稍微直接一点

date_three = setDT(bollywood)[, if (.N >= 3L) .(freq = .N), by = Rdate]

FWIW,这里有一些时间安排:

# Fake data
set.seed(2488)
bollywood=data.frame(Rdate=sample(seq(as.Date("2015-01-01"), as.Date("2015-12-31"), "1 day"), 
                                  1e6, replace=TRUE))

microbenchmark::microbenchmark(
  eipiDplyr = bollywood %>% count(Rdate) %>% filter(n >= 3),
  eipiDT = setDT(bollywood)[ , list(freq=.N), by = Rdate ][freq >= 3],
  ArunDT = setDT(bollywood)[, if (.N >= 3L) .(freq = .N), by = Rdate],
  times=20)
Unit: milliseconds
      expr      min       lq     mean   median       uq      max neval cld
 eipiDplyr 47.76676 51.21090 56.37334 53.48006 62.16901 71.94527    20   b
    eipiDT 43.41946 45.22264 47.57584 46.37179 47.97606 58.91733    20  a 
    ArunDT 42.97207 44.62598 47.76645 46.40803 51.46064 56.89516    20  a

【讨论】:

  • 谢谢@Arun。我的data.table 技能有点,咳咳,初级的。
  • 不用担心..只是想表明我们可以避免中间数据并直接得到结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多