首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中数字带的排序

R中数字带的排序
EN

Stack Overflow用户
提问于 2020-05-31 08:01:35
回答 1查看 89关注 0票数 0

我有一些数字变量,它们被归类为几个波段(比如1-3,3-5,5-7等等)。我想主要为他们的乐队定单。例如,在下面的数据框架中。

代码语言:javascript
运行
复制
df <- data.frame(x = c("1-3", "3-5","5-9", "9-10", "10-12"))

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

电流输出

代码语言:javascript
运行
复制
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

期望输出

代码语言:javascript
运行
复制
  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、500-10000、10000 - 20000等)。dplyr中的解决方案是首选方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-31 08:06:21

如果x总是按照示例中所示的相同顺序排序,那么在使用count之前,可以根据它们的外观来安排因素级别。

代码语言:javascript
运行
复制
library(dplyr)
library(rlang)

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

然而,一个普遍的解决方案是在"-“之前得到数字,并在此基础上安排数据。

代码语言:javascript
运行
复制
df %>%
  mutate(x1 = as.numeric(sub('-.*', '', x)), 
         x = factor(x, levels = x[order(x1)])) %>%
  count(x)

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

代码语言:javascript
运行
复制
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}})
 }

然后将其用作:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62113229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档