【问题标题】:Sort Numeric Bands in R对 R 中的数字带进行排序
【发布时间】:2020-09-18 15:11:16
【问题描述】:

我有一些数字变量,它们分为几个波段(如 1-3、3-5、5-7 等)。我想维护他们的乐队秩序。例如,在下面的数据框中。

df <- data.frame(x = c("1-3", "3-5","5-9", "9-10", "10-12"))

当我在此列中运行任何数据操作操作(如 group_by、count)时,它会返回此输出。

电流输出

library(tidyverse)
df %>% count(x)

  x         n
  <fct> <int>
1 1-3       1
2 3-5       1
3 5-9       1
4 9-10      1
5 10-12     1

期望的输出

  x         n
  <fct> <int>
1 1-3       1
2 3-5       1
3 5-9       1
4 9-10      1
5 10-12     1

重要提示 - 解决方案应该是动态的,这意味着它应该在任何类型的数字波段上运行,即使它从 1000 或任何其他数值开始(例如 1250 - 2500、2500 - 5000、 5000 - 10000、10000 - 20000 等)。 dplyr 中的解决方案是首选。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    如果x 始终按照示例中所示的顺序进行排序,您可以在使用count 之前根据它们的外观排列因子水平。

    library(dplyr)
    library(rlang)
    
    df %>%
      mutate(x = factor(x, levels = unique(x))) %>% 
      count(x)
    

    但是,一般的解决方案是获取“-”之前的数字并根据该数字排列数据。

    df %>%
      mutate(x1 = as.numeric(sub('-.*', '', x)), 
             x = factor(x, levels = x[order(x1)])) %>%
      count(x)
    

    要将其包装在一个函数中,我们可以使用:

    count_band_data <- function(data, col, sep = '-') {
       data %>%
         mutate(temp = as.numeric(sub(paste0(sep, '.*'), '', {{col}})), 
                {{col}} := factor({{col}}, levels = {{col}}[order(temp)])) %>%
         count({{col}})
     }
    

    然后将其用作:

    df %>% count_band_data(x) 
    
    
    # A tibble: 5 x 2
    #  x         n
    #  <fct> <int>
    #1 1-3       1
    #2 3-5       1
    #3 5-9       1
    #4 9-10      1
    #5 10-12     1
    

    【讨论】:

    • 谢谢。这真的很快。我们可以包装一个函数,使解决方案变得更通用(考虑不考虑“-”作为带中的分隔符)?
    • 更新了答案。你的意思是这样的吗?
    • 非常感谢。 {{ }} 是胶水包的一部分?
    • 不,在rlang。更新了答案以包含库。
    猜你喜欢
    • 1970-01-01
    • 2019-09-26
    • 2021-09-07
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多