检索每个值的数据范围并将其排序

时间:2019-01-17 13:28:23

标签: r

我有以下数据集:

Class     Value
Abrir     15
Abrir     9
Abrir     29
Abrir     13
Salvar    10
Salvar    6
Salvar    9
Shift     16
Shift     12
Shift     10
Shift     17

我想检索每个类的值范围,然后根据最小值对它们进行排序,如下所示:

Salvar 6 - 10
Abrir  9 - 29
Shift  10 - 17

我尝试这样做,但是我做不到。有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

一种选择是根据需要对“类”和paste,“值”的rangearrange进行分组{p>

library(dplyr)
library(readr)
df1 %>%
   group_by(Class) %>%
   summarise(Range = paste(range(Value), collapse = ' - ')) %>%
   arrange(parse_number(Range))
# A tibble: 3 x 2
#  Class  Range  
#  <chr>  <chr>  
#1 Salvar 6 - 10 
#2 Abrir  9 - 29 
#3 Shift  10 - 17

或将其放在list

aggregate(Value ~ Class, df1, FUN = range)

数据

df1 <- structure(list(Class = c("Abrir", "Abrir", "Abrir", "Abrir", 
 "Salvar", "Salvar", "Salvar", "Shift", "Shift", "Shift", "Shift"
 ), Value = c(15L, 9L, 29L, 13L, 10L, 6L, 9L, 16L, 12L, 10L, 17L
 )), class = "data.frame", row.names = c(NA, -11L))

答案 1 :(得分:2)

这是具有minmax的基本R解决方案,即

df2 <- aggregate(Value ~ Class, df1, function(i) paste0(min(i), ' - ', max(i)))

#   Class   Value
#1  Abrir  9 - 29
#2 Salvar  6 - 10
#3  Shift 10 - 17

我们可以使用一个简单的正则表达式对结果数据帧进行排序,即(考虑到上面的数据帧称为df2

df2[order(as.numeric(gsub('([0-9]+)\\s-\\s[0-9]+', '\\1', df2$Value))),]

#   Class   Value
#2 Salvar  6 - 10
#1  Abrir  9 - 29
#3  Shift 10 - 17