我正在尝试根据多个条件将另一列中的列求和并将其放入当前表中。
table1 <- tribble(~company_id,~date,
1,"2018-01-02",
1,"2018-01-03",
2,"2018-01-02",
2,"2018-01-03")
table2 <- tribble(~other_id, company_id,~date_created,~max_rank,rank,date_closed,
1,1,"2018-01-02",20,2,NA,
1,1,"2018-01-03",22,1,NA,
2,2,"2018-01-02",20,5,NA,
2,2,"2018-01-03",22,4,NA)
我想在表1中创建一个新列,该列将输入以下公式:
= sum( (max_rank-rank)/(max_rank-1))
但仅在以下情况下
(date<=date_created, date>(date_created+20), date<date_closed, max_rank-1!=0, rank!=0)
修改
我希望实现的输出应如下所示:
Table 1
| company id | date | cc score |
---------------------------------------
| 1 | 2018-01-02 | 0.9473 |
| 1 | 2018-01-03 | 1.9473 |
| 2 | 2018-01-02 | 0.7895 |
| 2 | 2018-01-03 | 1.6466 |
第一个可以计算为(20-2)/(20-1)= 0.9473 秒的计算公式为(20-2)/(20-1)+(22-1)/(22-1)= 1.9473
答案 0 :(得分:0)
您可以使用 dplyr 软件包。 请尝试以下代码:
> library(dplyr)
> cbind(table1,table2)%>%inner_join(table1)%>%inner_join(table2)%>%filter(date<=date_created|date>(date_created+20)&max_rank-1!=0&rank!=0)%>%mutate(cc_data=(max_rank-rank)/(max_rank-1))%>%group_by(company_id)%>%mutate(cc_data=cumsum(cc_data))%>%select(company_id,date,cc_data)
使用cbind():我们需要date_created和date列。
两次inner_join():确保没有多余的数据。
请提出比这更好的解决方案。
答案 1 :(得分:0)
这似乎可行:
table1[, cc_score := table2[table1,
on = .(company_id = company_id, date_created<=date, date_created_pls_20>date),
sum(ifelse(!is.na(rank) & (is.na(date_closed) | date_closed>date),
((max_rank-rank)/(max_rank-1)), 0)),
by = .EACHI][["V1"]]]
在date_created_pls_20
所在的列中,使用date_created
列并仅添加20