我的数据框如下:
dataframe <- read.table(text="
id send paid
1 2013-01-25 NA
2 2013-02-21 2013-02-23
2 2013-02-21 2013-02-25
2 2013-02-21 2013-02-28
3 2013-03-01 2013-03-02
3 2013-03-01 2013-03-03
4 2013-06-23 2013-05-03
", header=TRUE)
我想做的是为每个dplyr
在id
中创建新的列结果,该列结果的行数要高于实际id
和{{1}的send发送之间的差} paid
上方的日期少于120天。
换句话说,id
1上面没有行,因此结果将为0,id
2的result
应该为0,因为上面的值为id
。 NA
3的结果为3,因为id
与(2013-03-01
,2013-02-23
,2013-02-25
)之间的差小于120天。 2013-02-28
4的结果应该为4,因为id
之间的日期差小于120天(2013-06-23
,2013-03-03
,2013-03-02
,2013-02-28
)。
2013-02-25
答案 0 :(得分:0)
使用dplyr包可以做到这一点:
w.get()
说明:第一步,定义一个函数,该函数对小于给定索引(小于120天)的索引行进行计数。
第二步,使用步骤1的功能将library(dplyr)
dataframe$paid <- as.Date(dataframe$paid)
dataframe$send <- as.Date(dataframe$send)
dataframe$id <- as.numeric(dataframe$id)
dataframe$paid-dataframe$send
count_fun<-function(myid){dataframe %>% filter(id<=myid) %>% mutate(diff=abs(paid-last(send))<120)%>% filter(id<myid) %>% summarise(sum(diff, na.rm = T)) %>% pull()}
dataframe$result <- sapply(dataframe$id, count_fun)
id send paid result
1 1 2013-01-25 <NA> 0
2 2 2013-02-21 2013-02-23 0
3 2 2013-02-21 2013-02-25 0
4 2 2013-02-21 2013-02-28 0
5 3 2013-03-01 2013-03-02 3
6 3 2013-03-01 2013-03-03 3
7 4 2013-06-23 2013-05-03 4
应用于id列。