给定 R 中某些条件的累积频率
cumulative frequency given certain conditions in R
我是 R 的新手,如果 ID 相同但不同 date.Also,我真的不知道如何计算一行的累计出现次数,如果第一个日期出现不止一次,它不应计入第 2 行和第 3 行的第一个 attempt.Look,这就是为什么我要构建的列称为 "count" 并且等于零。 "count"表示该id出现的次数,但遵循以下两条规则:
1.If 第一次出现Id,赋0。例如,对于 Id 1,尽管该 Id 的第一个日期有两个不同的寄存器,但 "count" 等于零。
2.For 下一个 Id 1 出现(Id1 的第 3 行)它有不同的日期,这就是 "count" 等于 2 的原因。因为 01/01/2018 Id1 出现了两次。
这是 DT,我要查找的结果在 "count" 列中:
我们可以使用 dplyr
到 group_by
id
和 return 0 作为第一个 date
else return 的出现次数第一 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)
带有 data.table
的选项,我们将 'data.frame' 转换为 'data.table' (setDT(df)
),按 'id' 分组,创建 'count'作为逻辑向量(date == first(date)
)的sum
,然后将每个'id'的'count'的第一行更改为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)
我是 R 的新手,如果 ID 相同但不同 date.Also,我真的不知道如何计算一行的累计出现次数,如果第一个日期出现不止一次,它不应计入第 2 行和第 3 行的第一个 attempt.Look,这就是为什么我要构建的列称为 "count" 并且等于零。 "count"表示该id出现的次数,但遵循以下两条规则:
1.If 第一次出现Id,赋0。例如,对于 Id 1,尽管该 Id 的第一个日期有两个不同的寄存器,但 "count" 等于零。
2.For 下一个 Id 1 出现(Id1 的第 3 行)它有不同的日期,这就是 "count" 等于 2 的原因。因为 01/01/2018 Id1 出现了两次。
这是 DT,我要查找的结果在 "count" 列中:
我们可以使用 dplyr
到 group_by
id
和 return 0 作为第一个 date
else return 的出现次数第一 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)
带有 data.table
的选项,我们将 'data.frame' 转换为 'data.table' (setDT(df)
),按 'id' 分组,创建 'count'作为逻辑向量(date == first(date)
)的sum
,然后将每个'id'的'count'的第一行更改为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)