【问题标题】:R sum column in second table based on if conditions基于if条件的第二个表中的R sum列
【发布时间】:2019-09-05 10:02:17
【问题描述】:

我正在尝试对另一个表中的列求和,并根据一些条件将其放入当前表中。

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

【问题讨论】:

  • 你能告诉你预期的输出吗?
  • 另外,如果您以更可复制的格式而不是文本形式发布数据,将会很有帮助。使用dput(head(your_data)) 并发布结果。
  • 看起来您的数据集是 data.frame 而不是 data.table。试试setDT(table1) 然后应用你的代码
  • @akrun 我试过了,但没用
  • 好的,我的评论是基于您显示的错误。您能否请dput这两个示例并在您的帖子中复制/粘贴输出以使数据结构正确

标签: mysql r dplyr rmysql


【解决方案1】:

您可以使用 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():确保没有多余的数据。

请提出比这更好的解决方案。

【讨论】:

  • 这些表非常大,dplyr 包性能不足,因为它试图合并它们以创建一个太大的表
【解决方案2】:

这似乎有效:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 2021-08-20
    • 2015-12-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多