【问题标题】:Group and compare numbers in a list对列表中的数字进行分组和比较
【发布时间】:2020-02-05 19:17:19
【问题描述】:

考虑以下对两个列表进行cbind 操作后获得的数据帧

> fl
  x meanlist
1 1     48.5
2 2     32.5
3 3     28.0
4 4     27.0
5 5     25.5
6 6     20.5
7 7     27.0
8 8     24.0

class_median <- list(0, 15, 25, 35, 45)
class_list <- list(0:10, 10:20, 20:30, 30:40, 40:50)

class_median 中的值代表类 -10 到 +10、10 到 20、20 到 30 等

首先,我试图根据class_list 中的类对fl$meanlist 中的值进行分组。其次,我试图为每个类返回一个最接近中值的值,如下所示

> fl_subset
  x meanlist cm
1 1     48.5 45
2 2     32.5 35
3 5     25.5 25

我正在尝试使用循环进行比较,但它似乎很长且难以管理,结果不正确

【问题讨论】:

    标签: r list vector comparison


    【解决方案1】:

    这是dplyr 的一种方法:

    library(dplyr)
    
    # do a little prep--name classes, extract breaks, put medians in a data frame
    names(class_list) = letters[seq_along(class_list)]
    breaks = c(min(class_list[[1]]), sapply(class_list, max))
    med_data = data.frame(median = unlist(class_median), class = names(class_list))
    
    
    fl %>% 
      # assign classes
      mutate(class = cut(meanlist, breaks = breaks, labels = names(class_list))) %>%
      # get medians
      left_join(med_data) %>%
      # within each class...
      group_by(class) %>%
      # keep the row with the smallest absolute difference to the median
      slice(which.min(abs(meanlist - median))) %>%
      # sort in original order
      arrange(x)
    
    # Joining, by = "class"
    # # A tibble: 3 x 4
    # # Groups:   class [3]
    #       x meanlist class median
    #   <int>    <dbl> <fct>  <dbl>
    # 1     1     48.5 e         45
    # 2     2     32.5 d         35
    # 3     5     25.5 c         25
    

    【讨论】:

      【解决方案2】:

      利用purrrdplyr 的一种方法可能是:

      map2(.x = class_list,
           .y = class_median, 
           ~ fl %>%
            mutate(cm = between(meanlist, min(.x), max(.x))) %>%
            filter(any(cm)) %>%
            mutate(cm = cm*.y)) %>%
       bind_rows(.id = "ID") %>%
       group_by(ID) %>%
       slice(which.min(abs(meanlist-cm)))
      
      
      
        ID        x meanlist    cm
        <chr> <int>    <dbl> <dbl>
      1 3         5     25.5    25
      2 4         2     32.5    35
      3 5         1     48.5    45
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-07
        • 1970-01-01
        • 2023-04-08
        • 2011-08-08
        相关资源
        最近更新 更多