从另一列 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
有多少天,但我不知道该怎么做,有人知道吗?
关于第一个,例如:88734
在BA
有1天,在MI
有3天,在FA
有1天,依此类推。
另一个例子(不是真实的):我有 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 天。
关于第二个,即使许多 Ptt
具有相同的 date
,我也需要对所有天数求和,我想是这样,对 88734
在 [=17] 的所有天求和=],然后对 129031
的所有天数求和,然后将它们放在一起。 (不知道这个道理对不对)
例如(不是真实的),88734
在 BA
有 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
谢谢!
您可以使用 dplyr
和 lubridate
来获得您想要的输出:
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]
我的真实数据框有 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
有多少天,但我不知道该怎么做,有人知道吗?
关于第一个,例如:88734
在BA
有1天,在MI
有3天,在FA
有1天,依此类推。
另一个例子(不是真实的):我有 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 天。
关于第二个,即使许多 Ptt
具有相同的 date
,我也需要对所有天数求和,我想是这样,对 88734
在 [=17] 的所有天求和=],然后对 129031
的所有天数求和,然后将它们放在一起。 (不知道这个道理对不对)
例如(不是真实的),88734
在 BA
有 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
谢谢!
您可以使用 dplyr
和 lubridate
来获得您想要的输出:
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]