我有三列“名称”,“成功虚拟”和“日期”。对于每个名称,我要检查该名称的过去成功。
例如,如果名称“ 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)。
请告知是否有更好的方法。
答案 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