Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 对数据帧中的组重复应用条件摘要_R_Dplyr_Data.table - Fatal编程技术网

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

R 对数据帧中的组重复应用条件摘要,r,dplyr,data.table,R,Dplyr,Data.table,我有一个大数据框,看起来像这样: 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

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

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
       ...
数据帧已按
组id
距离进行排序。我想知道dplyr或data.table的效率相当于执行以下操作:

在每个
组中\u id

  • 将当前
    组id
    距离的唯一和排序值设置为
    d1、d2、…、d_n
  • 对于
    d1,d2,…,d_n
    中的每个
    d
    :对
    距离
    值小于
    d
    的所有
    度量值计算一些函数
    f
    。函数
    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
    时,应排除这两行(在这种情况下,这将导致空向量)

    一种可能的方法是使用
    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]
    
    数据:

    库(data.table)
    
    DT不要认为这会比
    data.table
    选项快,但这里有一种方法使用
    dplyr

    library(dplyr)
    
    df %>%
      group_by(group_id) %>%
      mutate(new = purrr::map_dbl(distance, ~f(metric[distance < .])))
    
    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")
    
    library(dplyr)
    
    df %>%
      group_by(group_id) %>%
      mutate(new = purrr::map_dbl(distance, ~f(metric[distance < .])))
    
    df %>%
      group_by(group_id) %>%
      mutate(new = purrr::map_dbl(distance, ~f(metric[distance < .]))) %>%
      filter(!duplicated(distance))