按发生频率对数据框列进行排序

时间:2016-01-27 11:32:11

标签: r sorting dataframe

我有一个名为df的数据框,有三列可以说,

Region ID  Salary
1      A1  100
1      A2  1001
1      A3  2000
1      A4  2431
1      A5  1001
..............
..............
2      A6  1002
2      A7  1002
2      A8  1002
3      A9  3001
3      A10 3001
3      A11 4001

现在我想根据Region的出现来排序列Salary,即使用频率表或其他东西,获取每个区域出现的概率并对它们进行排序。请假设数据集足够大(1000行)

P.S:任何人都可以建议一个好的方法来做一些。请在答案中使用列名,因为真实表中间有一些列

提前致谢

                  **EDIT 1**

我认为我不够清楚,感谢所有回复的人,我真诚地为不清楚而道歉:

使用当前数据集,我们需要创建一个频率表:

Region  Salary(bin)     Count
1       1K              6                   
1       5K              3                   
1       2K              2                   
1       15K             2                   
1       0.5K            2                   
1       24K             1                   
1       0K              0                   

使用这个我们可以分类在我们的数据框df中添加一个名为bin的桶(直方图中的桶)

Region     ID  Salary  (bin)   Count
    1      A1  100     1K      6
    1      A2  1001    2K      2
    1      A3  2000    2K      2
    1      A4  2431    5K      3

..........................所以...............

我们可以使用以下方式完成上述操作:

df$bin <- cut(df$salary, breaks=hist(df$salary)$breaks)

按地区和计算和薪资排序后,我们得到:

Region     ID  Salary  (bin)   Count
    1      A1  100     1K      6
    1      A4  2431    5K      3
    1      A3  2000    2K      2
    1      A2  1001    2K      2

如您所见,我们需要为每个区域创建频率表并进行排序。我使用Tableau完成了上述操作,但我想在R

中自动执行此操作

希望我很清楚

3 个答案:

答案 0 :(得分:8)

一种可能的方法是使用data.table添加freq列,然后相应地对数据进行排序:

library(data.table)
setDT(df)[,freq := .N, by = c("Region","Salary")]

# Sort
df[order(freq, decreasing = T),]

# As a oneliner (thx @Jaap)
setDT(df)[, freq := .N, by = .(Region,Salary)][order(-freq)]

答案 1 :(得分:5)

基地R:

df <- transform(df, freq= ave(seq(nrow(df)), Salary, FUN=length))
df[order(-df$freq), ]

输出:

   Region  ID Salary freq
6       2  A6   1002    3
7       2  A7   1002    3
8       2  A8   1002    3
2       1  A2   1001    2
5       1  A5   1001    2
9       3  A9   3001    2
10      3 A10   3001    2
1       1  A1    100    1
3       1  A3   2000    1
4       1  A4   2431    1
11      3 A11   4001    1

答案 2 :(得分:2)

library(dplyr)
data %>% group_by(Region, Salary) %>% summarise(n=n()) %>% ungroup() %>% arrange(-n)

(编辑:来自Jaap ungroup的评论,好点)