【问题标题】:use DPLYR to add a new row as a calculation of other grouped rows使用 DPLYR 添加新行作为其他分组行的计算
【发布时间】:2019-01-15 18:46:52
【问题描述】:

我有一个类似于以下的数据对象:

> temp2 %>% arrange(date_val) %>% select(date_val,kpi_name,kpi_value)
# Source:     spark<?> [?? x 3]
# Ordered by: date_val
   date_val     kpi_name              kpi_value
   <dttm>              <chr>                     <dbl>
 1 2018-12-04 00:00:00 KPI1                          0
 2 2018-12-04 00:00:00 KPI2                         38
 3 2018-12-04 00:01:00 KPI2                         55
 4 2018-12-04 00:01:00 KPI1                          1
 5 2018-12-04 00:02:00 KPI2                         55
 6 2018-12-04 00:02:00 KPI1                          1
 7 2018-12-04 00:03:00 KPI1                          0
 8 2018-12-04 00:03:00 KPI2                         58
 9 2018-12-04 00:04:00 KPI2                         45
10 2018-12-04 00:04:00 KPI1                          1
# ⦠with more rows
>

我想为每个分组的 date_val 插入一个新行,这将对当前对象中可用的 kpi_name/kpi_value 执行该 date_val 组的计算。例如,假设我需要将以下新 KPI3 计算为 100*(KPI1/KPI2),这将提供一个新数据对象,例如:

# Source:     spark<?> [?? x 3]
# Ordered by: date_val
   date_val     kpi_name              kpi_value
   <dttm>              <chr>                     <dbl>
 1 2018-12-04 00:00:00 KPI1                          0
 2 2018-12-04 00:00:00 KPI2                         38
 3 2018-12-04 00:00:00 KPI3                          0
 4 2018-12-04 00:01:00 KPI2                         55
 5 2018-12-04 00:01:00 KPI1                          1
 6 2018-12-04 00:01:00 KPI3                      0.018
 7 2018-12-04 00:02:00 KPI2                         55
 8 2018-12-04 00:02:00 KPI1                          1
 9 2018-12-04 00:02:00 KPI3                      0.018
10 2018-12-04 00:03:00 KPI1                          0
11 2018-12-04 00:03:00 KPI2                         58
12 2018-12-04 00:03:00 KPI3                          0
13 2018-12-04 00:04:00 KPI2                         45
14 2018-12-04 00:04:00 KPI1                          1
15 2018-12-04 00:04:00 KPI3                      0.022
# ⦠with more rows

这可以在 DPLYR 中完成吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    应该这样做:

    library(tidyverse)
    
    temp2 %>% spread(kpi_name, kpi_value) %>% 
      mutate(KPI3 = 100*(KPI1/KPI2)) %>% 
      gather(kpi_name, kpi_value, -date_val)
    

    虽然 rbind 在新行中在技术上是可行的,但它的效率相对较低且语法笨拙。转换为逻辑宽格式,添加列,然后再转换回来更有意义。

    【讨论】:

    • 谢谢。看起来 spark 对象不支持扩展功能,但我可以先将对象转换为“as_tibble”,它可以按预期工作。
    • @JeffKraus 太好了,如果您想继续使用 spark 对象,这个答案可能会有所帮助:stackoverflow.com/questions/50465390/gather-in-sparklyr
    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2014-06-20
    • 2016-10-09
    • 2016-07-26
    • 2019-04-29
    • 2017-06-14
    相关资源
    最近更新 更多