代码之家  ›  专栏  ›  技术社区  ›  ved

对数据帧中的组重复应用条件摘要

  •  1
  • ved  · 技术社区  · 5 年前

    我有一个大数据框,看起来像这样:

    group_id    distance    metric
           1         1.1      0.85
           1         1.1      0.37
           1         1.7      0.93   
           1         2.3      0.45 
           ...
           1         6.3      0.29
           1         7.9      0.12
           2         2.5      0.78
           2         2.8      0.32
           ...
    

    数据帧已按排序 group_id distance . 我想知道dplyr或data.table的效率相当于执行以下操作:

    在每个 组id :

    1. 在当前 组id d1,d2,...,d_n .
    2. 每人 d 首被告、次被告、被告 f 论社会的一切价值 metric D . 功能 F F 在空向量上定义良好。

    因此,在上面的示例中,所需的数据帧如下所示:

    group_id    distance_less_than    metric
           1                   1.1      f(empty vector)
           1                   1.7      f(0.85, 0.37)
           1                   2.3      f(0.85, 0.37, 0.93) 
           ...
           1                   7.9      f(0.85, 0.37, 0.93, 0.45,...,0.29)
           2                   2.5      f(empty vector)
           2                   2.8      f(0.78)
           ...
    

    注意如何 距离 值可以重复,就像值一样 1.1 1 1.1 (在这种情况下,这将导致一个空向量)。

    1 回复  |  直到 5 年前
        1
  •  5
  •   chinsoon12    5 年前

    一种可能的方法是使用中可用的非等联接 data.table . 左表是组id和距离的唯一组合集,右表的距离都小于左表的距离。

    f <- sum
    DT[unique(DT, by=c("group_id", "distance")), on=.(group_id, distance<distance), allow.cartesian=TRUE,
        f(metric), by=.EACHI]
    

    输出:

       group_id distance   V1
    1:        1      1.1   NA
    2:        1      1.7 1.22
    3:        1      2.3 2.15
    4:        1      6.3 2.60
    5:        1      7.9 2.89
    6:        2      2.5   NA
    7:        2      2.8 0.78
    

    数据:

    library(data.table)
    DT <- fread("group_id    distance    metric
    1         1.1      0.85
    1         1.1      0.37
    1         1.7      0.93   
    1         2.3      0.45 
    1         6.3      0.29
    1         7.9      0.12
    2         2.5      0.78
    2         2.8      0.32")
    
        2
  •  1
  •   Ronak Shah    5 年前

    不要认为这会比 data.table 选项,但这里有一种使用 dplyr

    library(dplyr)
    
    df %>%
      group_by(group_id) %>%
      mutate(new = purrr::map_dbl(distance, ~f(metric[distance < .])))
    

    f 这是你的职责。 map_dbl 函数的返回类型应为双精度。如果您的函数具有不同的返回类型,则可能需要使用 map_int , map_chr 或者喜欢。

    如果您希望每个只保留一个条目 distance filter duplicated

    df %>%
      group_by(group_id) %>%
      mutate(new = purrr::map_dbl(distance, ~f(metric[distance < .]))) %>%
      filter(!duplicated(distance))