给定R中的某些条件的累积频率

时间:2019-05-26 02:41:57

标签: r multiple-conditions cumulative-frequency

我是R的新手,如果ID相同但日期不同,我真的不知道如何计算行的累积出现次数,而且如果第一个日期出现多次,则不应计入第一次尝试。查看第2行和第3行,这就是为什么我要构建的列称为“ count”并且等于零的原因。 “计数”代表ID出现的时间,但遵循以下两个规则:

1。如果这是Id的首次出现,它将分配零。例如,对于ID 1,尽管该ID的第一个日期有两个不同的寄存器,但“ count”等于0。

2。对于下一个Id 1出现(Id1的第3行),它具有不同的日期,这就是为什么“ count”等于2的原因。因为01/01/2018 Id1出现了两次。

这是DT,我正在寻找的结果在“计数”列中:

enter image description here

2 个答案:

答案 0 :(得分:1)

我们可以使用dplyrgroup_by id并为第一个date返回0,否则返回第一个date的出现次数

library(dplyr)

df %>%
  group_by(id) %>%
  mutate(count = ifelse(date == date[1L], 0, sum(date == date[1L])))

#     id   date       count
#   <dbl> <fct>      <dbl>
#1     1 01/01/2018     0
#2     1 01/01/2018     0
#3     1 02/01/2018     2
#4     2 03/02/2018     0
#5     2 04/04/2018     1

或使用具有类似逻辑的基数R ave

as.numeric(with(df, ave(date, id, FUN = function(x) 
           ifelse(x == x[1L], 0, sum(x == x[1L])))))
#[1] 0 0 2 0 1

数据

df <- data.frame(id = c(1, 1, 1, 2, 2), date = c("01/01/2018", "01/01/2018", 
     "02/01/2018", "03/02/2018", "04/04/2018"), stringsAsFactors = FALSE)

答案 1 :(得分:0)

带有data.table的选项,其中我们将“ data.frame”转换为“ data.table”(setDT(df)),并按“ id”分组,将“ count”创建为{{1 }}(sum),然后将每个“ id”的“ count”的第一行更改为0

date == first(date)

数据

library(data.table)
setDT(df)[,  count := sum(date == first(date)), id]
df[df[, .I[1], id]$V1, count := 0][]
#   id       date count
#1:  1 01/01/2018     0
#2:  1 01/01/2018     2
#3:  1 02/01/2018     2
#4:  2 03/02/2018     0
#5:  2 04/04/2018     1