Столбец R sum во второй таблице на основе условий if - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь суммировать столбец в другой таблице и поместить его в мою текущую таблицу на основе ряда условий.

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

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Это похоже на работу:

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

0 голосов
/ 16 апреля 2019

Вы можете использовать пакет 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 () : чтобы убедиться в отсутствии дополнительных данных.

Пожалуйста, предложите лучшее решение, чем это.

...