【问题标题】:Find number days by condition from another column, R从另一列 R 中按条件查找天数
【发布时间】:2020-10-12 01:44:25
【问题描述】:

我有一个这样的数据框:

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           
...

我想计算每个Ptt 在每个area 有多少天,但我不知道该怎么做,有人知道吗?

我的预期是这样的:

Ptt      Date                      Area        Days
88734    2016-10-23 05:39:18       BA           1  
88734    2016-10-23 06:53:13       BA           1
88734    2016-11-09 08:32:18       MI           1 
88734    2016-11-19 06:45:27       MI           2
88734    2016-12-20 12:30:43       MI           3
88734    2016-12-29 02:45:35       FA           1  
129041   2017-10-05 04:55:24       BA           1 
129041   2016-10-23 06:45:30       MI           1 
129041   2016-11-16 07:10:32       FA           1 
129041   2016-11-29 03:43:54       FA           2
120941   2017-01-02 14:54:39       FA           3
...
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 有多少天 例如:88734BA 有 1 天,MI 有 3 天,FA 有 1 天,以此类推。

我想要这个:

Ptt      Area        Days
88734    BA           1
88734    MI           3 
88734    FA           1  
129041   BA           1 
129041   MI           1 
120941   FA           3

谢谢!

【问题讨论】:

  • 88734 have 2 days at BA。您能解释一下您是如何计算天数的吗?
  • 对不起,我的错误
  • 我知道,但我想了解我不清楚的计算逻辑。
  • 啊,我没有计算,我想要那个结果,我也不知道该怎么做
  • 你需要dt %>% count(Ptt, Area) 吗?

标签: r count conditional-statements days


【解决方案1】:

您可以将date 列转换为POSIXct 并从中提取日期。对于每个PttArea,您可以为每个日期分配一个唯一编号。

library(dplyr)

dt %>%
  mutate(date = lubridate::ymd_hms(date), 
         date1 = as.Date(date)) %>%
  group_by(Ptt, Area) %>%
  mutate(Days = dense_rank(date1)) %>%
  ungroup() %>%
  select(-date1)

#  Ptt    date                Area   Days
#   <chr>  <dttm>              <chr> <int>
# 1 88734  2016-10-23 05:39:18 BA        1
# 2 88734  2016-10-23 06:53:13 BA        1
# 3 88734  2016-11-09 08:32:18 MI        1
# 4 88734  2016-11-19 06:45:27 MI        2
# 5 88734  2016-12-20 12:30:43 MI        3
# 6 88734  2016-12-29 02:45:35 FA        1
# 7 120941 2017-10-05 04:55:24 BA        1
# 8 120941 2016-10-23 06:45:30 MI        1
# 9 120941 2016-11-16 07:10:32 FA        1
#10 120941 2016-11-29 03:43:54 FA        2
#11 120941 2017-01-02 14:54:39 FA        3

既然你有 data.table ,你也可以使用 data.table 语法来做到这一点:

library(data.table)

dt[, date := lubridate::ymd_hms(date)]
dt[, date1 := as.Date(date)]
dt[, Days := match(date1, unique(date1)), .(Ptt, Area)]

【讨论】:

  • 谢谢@Ronak Shah,但我如何才能找到每个 ptt 和区域的这些天数?我想我没有解释清楚,对不起!例如,88734 在 BA 有 12 天,在 MI 有 45 天,在 FA 有 60 天?我试过dt%&gt;% group_by(Ptt, Area, Days) %&gt;% summarise(days.length = length(Days), maxi.days = max(Days)),但没用
  • @ÉrikaSoaresCoelho 但这不是您在预期输出中显示的内容? 88734 如何在 BA 有 12 天?每个PttArea 都需要max(date) - min(date) 吗?
  • 这是88734 的一个例子,因为我的真实数据有超过 90.000 行,所以我需要知道每个Ptt 在每个Area 有多少天。例如结果,88734BA 有 12 天,MI 有 45 天,FA 有 60 天,依此类推,在我的真实数据框中,我真的有 32Ptt
猜你喜欢
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 2021-04-21
  • 2021-10-23
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
相关资源
最近更新 更多