我是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,我正在寻找的结果在“计数”列中:
答案 0 :(得分:1)
我们可以使用dplyr
到group_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