R:分类变量的计数频率(以日期为条件)

时间:2019-04-04 20:55:44

标签: r count frequency

我有三列“名称”,“成功虚拟”和“日期”。对于每个名称,我要检查该名称的过去成功。

例如,如果名称“ Peter”出现过3次,那么每次我想用“ Success == 1”和“ Date”之前发生的次数来计数“ Peter”的数量。

“过去成功”列需要获得的输出示例。

Name    Success Date   Past Success
David      1    2018    1
Peter      0    2017    3
Peter      1    2016    2
David      1    2017    0
Peter      1    2015    1
Peter      0    2010    1
Peter      1    2005    0
Peter     NA    2004    0

有什么办法可以快速做到吗?

我还需要非常快,因为我的数据很大。

我所做的是我根据名称和日期对数据进行了排序,并根据之前的100个观测值检查了每个观测值(因为名称的出现频率上限为100)。

请告知是否有更好的方法。

3 个答案:

答案 0 :(得分:1)

尝试使用此数据表方法:

library(data.table)
data <-data.table(Name = rep(c("David","Peter","David","Peter"), c(1,2,1,4)),
                  Success = c(1,0,1,1,1,0,1,NA),
                  Date = c(2018,2017,2016,2017,2015,2010,2005,2004)
                  )
data <- data[order(Date)]
data[Success == 1,"Past Success":= cumsum(Success), by = 'Name']

答案 1 :(得分:1)

有两种方法可以做到这一点。其中一个几乎与@FALL Gora一样,但另一个来自基础R

# these two steps are assuming you have data.table
# modify them accordingly if you have data.frame
data <- data[order(Name, Date)]
data[is.na(Success), Success := 0]

### tapply
data$past_success <- unlist(with(data, tapply(Success, Name, cumsum)))

### data.table
data[, past_success_dt := cumsum(Success), by = Name]

data

    Name Success Date past_success past_success_dt
1: David       1 2017            1               1
2: David       1 2018            2               2
3: Peter       0 2004            0               0
4: Peter       1 2005            1               1
5: Peter       0 2010            1               1
6: Peter       1 2015            2               2
7: Peter       1 2016            3               3
8: Peter       0 2017            3               3

答案 2 :(得分:0)

记录一下:数据框的dplyr方法

library(tidyverse)
data<-data%>%
  arrange(Name, Date) %>%
  group_by(Name) %>%
  mutate(Success = replace_na(Success, 0),
         PastSuccess = cumsum(Success))
data
> data
# A tibble: 8 x 4
# Groups:   Name [2]
  Name  Success  Date PastSuccess
  <fct>   <dbl> <dbl>        <dbl>
1 David       1  2017            1
2 David       1  2018            2
3 Peter       0  2004            0
4 Peter       1  2005            1
5 Peter       0  2010            1
6 Peter       1  2015            2
7 Peter       1  2016            3
8 Peter       0  2017            3