【问题标题】:cumulative frequency given certain conditions in R在 R 中给定特定条件的累积频率
【发布时间】:2019-10-12 02:16:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • id 1 第二行的计数不应该是 1 吗?
  • 不,因为是同一个日期。但是,由于 id 1 的第三行发生在不同的日期,所以它是 2。
  • id 2 的第一行怎么样?为什么是 0?
  • 为什么 id = 1 的第三行是 2 而 id = 2 的第二行是 1? count 代表什么?
  • 当 Id 和 date 第一次出现时,它应计为零。然后,Id2 和不同日期(2018 年 4 月 5 日)的第 2 行是一个,因为有一个相同 id 具有不同日期的先前寄存器。

标签: r multiple-conditions cumulative-frequency


【解决方案1】:

data.table 的一个选项,我们将“data.frame”转换为“data.table”(setDT(df)),按“id”分组,创建“计数”作为逻辑向量的sum (date == first(date)),然后将每个 '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)

【讨论】:

    【解决方案2】:

    我们可以使用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:在 [&lt;-.factor(*tmp*, i, value = c(0, 0, 2)) 中:无效因子水平,NA 生成 2:在 [&lt;-.factor(*tmp*, i, value = c(0, 1)) : 无效因子水平,NA生成
    • @Magggggg 这是因为您的 date 列是因素。通过 df$date &lt;- as.character(df$date) 将它们更改为字符,然后运行第二个。
    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 2013-05-20
    相关资源
    最近更新 更多