【问题标题】:R: count number of observations before and after dateR:计数日期之前和之后的观察次数
【发布时间】:2020-05-11 18:31:26
【问题描述】:

我有一个包含这些列的数据框:一个包含日期 (YYYY-MM-DD),一个包含年份(YYYY 为数字形式),一个包含个人 ID,其他包含特征。

我想过滤掉个人,以便仅保留在日期之前至少有 10 次观察和在日期之后有 5 次观察的人(最少总数为 15),其余的被过滤掉。按日期或年份过滤都可以。

你能想出什么方法来做到这一点,它不包括我与原始数据帧进行比较的大量新数据帧 - 以加快进程吗?

【问题讨论】:

  • 您能否展示一个具有预期输出的可重现的小示例,以便其他人可以测试
  • 编写一个适用于个人的函数,并使用tapplydplyr::filter 一次性将其应用于所有个人。

标签: r filter count


【解决方案1】:

我不得不做类似的事情,希望能找到一些代码来节省时间......

我没有找到直接的等价物,所以这是我使用 data.table 的解决方案:

创建一个类似结构的数据表:

ID_seq <- c(5,5,6,8,9,9,9)
dt <- setDT(data.frame(ID = sequence(ID_seq)))
setkey(dt, ID)
dt[, YR := 1:.N, by = .(ID)]
dt$event <- rep(0, nrow(dt))
dt$event[c(4,11,17,25,38,46)] <- 1 # strategically place events

那么就是创建一个满足条件的列了。我将其设置为事件前后必须至少有 3 年。以post为基础:

dt2 <- dt[, counter := seq_len(.N), by = list(ID, cumsum(event == 1L))][, cond := fifelse(sum(counter == 3) >  1, 1, 0), by = ID][cond == 1 ,]

对于发帖者的情况,只需更改第二个语句中的条件即可。

【讨论】:

    【解决方案2】:

    用 194 个 obs 和 30 个变量标记数据框

    过滤flags 数据框,使用select,使用dplyr::filter 获取所需列,使用str_detect 获取字符串条件:

       df <- select(flags, name) %>% filter(str_detect(flags$name, "^Al"))
    
    print(df)
    
        name
    1 Albania
    2 Algeria
    

    【讨论】:

      猜你喜欢
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      相关资源
      最近更新 更多