首页 > 解决方案 > 从另一列 R 中查找按条件计算天数

问题描述

我的真实数据框有超过 90000 行和 30Ptt

然后,我有一个这样的数据框:

Ptt      Date                      Area        
88734    2016-10-23 05:39:18       BA             
88734    2016-10-23 06:53:13       BA           
88734    2016-11-09 08:32:18       MI            
88734    2016-11-19 06:45:27       MI           
88734    2016-12-20 12:30:43       MI           
88734    2016-12-29 02:45:35       FA             
129041   2017-10-05 04:55:24       BA            
129041   2016-10-23 06:45:30       MI            
129041   2016-11-16 07:10:32       FA            
129041   2016-11-29 03:43:54       FA           
120941   2017-01-02 14:54:39       FA    



dt = data.table(Ptt= c("88734", "88734", "88734", "88734", "88734", "88734", "120941", "120941","120941","120941","120941"),
                date = c("2016-10-23 05:39:18",
                         "2016-10-23 06:53:13 ", 
                         "2016-11-09 08:32:18",
                         "2016-11-19 06:45:27",
                         "2016-12-20 12:30:43",
                         "2016-12-29 02:45:35",
                         "2017-10-05 04:55:24",
                         "2016-10-23 06:45:30",
                         "2016-11-16 07:10:32",
                         "2016-11-29 03:43:54",
                         "2017-01-02 14:54:39"),
                Area = c("BA", "BA", "MI", "MI", "MI", "FA", "BA", "MI", "FA", "FA", "FA"))  

我想要两件事。Ptt首先,计算每个人有多少天area。其次,每个人有多少天area,但我不知道该怎么做,有人知道吗?

关于第一个,例如:88734在 1 天,在BA3 天,在MI1 天FA,依此类推。

另一个例子(不是真实的):我有 2 天重复88734, 2016-10-23, 2016-10-23, 然后2016-11-09, 2016-11-09, 2016-11-09(这里重复 3 天),然后2016-12-29(这里 1 天)。所以,这88734总共有 3 天计算,而不是 6 天。

关于第二个,即使有date很多相同Ptt,我也需要对所有时间求和,我想就像,对88734at 的所有天BA数求和,然后对 的所有天数求和129031,然后将它们放在一起。(我不知道是否是正确的推理)

例如(不是真实的),88734有 10/08/2017、10/08/2017 在BA,但129041也有 10/08/2017、10/08/2017、10/08/2017 在BA。所以,在 2 天BA,而不是 1 天。

我想要这个:(可能是 2 个新闻数据框)

#First one
Ptt      Area        Days
88734    BA           1
88734    MI           3 
88734    FA           1  
129041   BA           1 
129041   MI           1 
120941   FA           3

#Second one
Area     Days
BA        2
MI        4
FA        4

谢谢!

标签: rconditional-statementscountingdays

解决方案


您可以使用dplyrandlubridate来获得您想要的输出:

dt %>%
  mutate(date = as_date(date)) %>%
  distinct() %>%
  count(Ptt, Area, name="Days")

返回

      Ptt Area Days
1: 120941   BA 1
2: 120941   FA 3
3: 120941   MI 1
4:  88734   BA 1
5:  88734   FA 1
6:  88734   MI 3

dt %>%
  mutate(date = as_date(date)) %>%
  distinct() %>%
  count(Area, name="Days")

   Area Days
1:   BA 2
2:   FA 4
3:   MI 4

推荐阅读