1

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

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

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

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

在此处输入图像描述

4

2 回答 2

1

我们可以使用dplyrtogroup_by id并为第一个返回 0,date否则返回第一个的出现次数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

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

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)
于 2019-05-26T03:11:51.653 回答
0

一个选项data.table,我们将“data.frame”转换为“data.table”(setDT(df)),按“id”分组,创建“count”作为sum逻辑向量(date == first(date)),然后更改“count”的第一行对于每个 'id' 到 0

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

数据

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)
于 2019-05-26T05:21:43.033 回答