【问题标题】:Find number counting days by condition from another column, R从另一列 R 中查找按条件计算天数
【发布时间】:2020-06-23 01:49:55
【问题描述】:

我的真实数据框有超过 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,我需要对所有时间求和,我猜是这样的,在 BA 处为 88734 求和所有天数,然后为 @ 求和所有天数987654342@,然后放在一起。 (不知道是不是正确的推理)

例如(不是真实的),88734 有 10/08/2017、10/08/2017 BA,但 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

谢谢!

【问题讨论】:

    标签: r conditional-statements counting days


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

      创建一个仅包含日期的列。

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

      之后,您可以计算每个PttArea 的唯一日期数,并且仅计算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)))
      

      数据表:

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

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

      【讨论】:

        猜你喜欢
        • 2020-10-12
        • 2021-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-20
        • 1970-01-01
        • 1970-01-01
        • 2021-11-16
        相关资源
        最近更新 更多