如何对数据框的子集进行排序

时间:2019-08-04 04:21:47

标签: r

请附上我的样本data set

我要实现的真正目的是创建一个数据帧,该数据帧首先根据时间段的升序对数据进行排序,并且在每个时间段内,数据均按大小写的降序再次排序(按时间段分组,地区,经理,员工)

到目前为止,我已经完成了此操作,但是它没有提供我想要的东西。

我打算绘制此值,所以这就是为什么我需要首先按升序对它进行排序,并且在每个值中我都希望数据按降序进行排序。

SampleRADN <- read_excel("C:/Users/xxx/Documents/Exercises/PBIR/SampleRADN.xlsx")
df1<-unique(data.frame(SampleRADN))
library(dplyr)
df2<-df1%>%count(period,region,manager,employee)
df3<-df2[order(df2$period, -df2$n)

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

@NelsonGon非常感谢您指出用户需要以更好的方式提供数据,以便正在寻找解决方案的人始终可以访问数据并进行回答。老实说,我没有想到这一点。但是,我的样本数据有600多个行,除通过链接提供数据外,我不知道如何复制这种大小的样本数据。 但是,我通过执行以下操作解决了这个问题

library(openxlsx)
library(dplyr)
library(tidyverse)
df <- read.xlsx("C:/Users/smpao1/Documents/Exercises/PBIR/SampleRADN.xlsx")
df1<-data.frame(df)
df2<-df1%>%count(period,region)
df3<-df2[order(df2$period, -df2$n),]
df4<-df1%>%count(period,region,manager,employee)
df5<-df4[order(df4$period, -df4$n),]
df6<-left_join(df3,df5,by=c("period"="period","region"="region"))
df7<-df6%>% select(period, region, manager, employee,n.y)

答案 1 :(得分:0)

如果我理解正确,OP将按升序对数据进行排序,并在每个周期内按案件数的降序对数据进行排序(按时期,地区,经理,员工分组)。

OP's own answer中的解决方案太复杂了。我的建议是将组计数添加到数据框中,然后按期间和计数进行排序。

dplyr

library(dplyr)
df2 <- readxl::read_xlsx("SampleRADN.xlsx") %>%  
  add_count(period, region, manager, employee, name = "count") %>%
  arrange(period, -count)
df2
# A tibble: 369 x 6
   region  period manager employee case      count
   <chr>    <dbl> <chr>   <chr>    <chr>     <int>
 1 Eastern      1 RP      DL       2019-467     12
 2 Eastern      1 RP      DL       2019-591     12
 3 Eastern      1 RP      DL       2019-1009    12
 4 Eastern      1 RP      DL       2019-1747    12
 5 Eastern      1 RP      DL       2019-2536    12
 6 Eastern      1 RP      DL       2019-2579    12
 7 Eastern      1 RP      DL       2019-683     12
 8 Eastern      1 RP      DL       2019-1127    12
 9 Eastern      1 RP      DL       2019-1748    12
10 Eastern      1 RP      DL       2019-1749    12
# ... with 359 more rows

data.table

library(data.table)
df <- readxl::read_xlsx("SampleRADN.xlsx")
setDT(df)[, count := .N, by = .(period, region, manager, employee)]
setorder(df, period, -count)
df
      region period manager employee       case count
  1: Eastern      1      RP       DL   2019-467    12
  2: Eastern      1      RP       DL   2019-591    12
  3: Eastern      1      RP       DL  2019-1009    12
  4: Eastern      1      RP       DL  2019-1747    12
  5: Eastern      1      RP       DL  2019-2536    12
 ---                                                 
365: Central      6      TG       RK 2019-28005     1
366: Central      6      EL       MP 2019-28363     1
367: Central      6      SS       DC 2019-29488     1
368: Central      6      JT       LV 2019-30283     1
369: Central      6      KJ       SL 2019-27948     1