从另一列 R 中按条件查找计数天数

Find number counting days by condition from another column, R

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

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

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 有多少天,但我不知道该怎么做,有人知道吗?

关于第一个,例如:88734BA有1天,在MI有3天,在FA有1天,依此类推。

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

关于第二个,即使许多 Ptt 具有相同的 date,我也需要对所有天数求和,我想是这样,对 88734 在 [=17] 的所有天求和=],然后对 129031 的所有天数求和,然后将它们放在一起。 (不知道这个道理对不对)

例如(不是真实的),88734BA 有 10/08/2017, 10/08/2017,但是 129041 有 10/08/2017, 10 /08/2017,10/08/2017 也在 BA。所以,在 BA 有 2 天,而不是 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

谢谢!

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

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

returns

      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

创建一个只有日期的列。

dt$date_col <- as.Date(as.POSIXct(dt$date, format = "%Y-%m-%d %T"))

之后,您可以计算每个 Ptt & Area 且仅 Area.

的唯一日期的数量

您可以使用 dplyr、base R 或 data.table 来执行此操作。

dplyr:

library(dplyr)
dt %>% group_by(Ptt, Area) %>% summarise(Days = n_distinct(date_col))

#  Ptt    Area   Days
#  <chr>  <chr> <int>
#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 %>% group_by(Area) %>% summarise(Days = n_distinct(date_col))

# Area   Days
#  <chr> <int>
#1 BA        2
#2 FA        4
#3 MI        4

基础 R :

aggregate(date_col~Ptt + Area, dt, function(x) length(unique(x)))

aggregate(date_col~Area, dt, function(x) length(unique(x)))

data.table :

library(data.table)
setDT(dt)[, .(days = uniqueN(date_col)), .(Ptt, Area)]

setDT(dt)[, .(days = uniqueN(date_col)), Area]